关闭顶部展开顶部

解读.NET中*延迟*特性的几个陷阱_.Net教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:C#教程:Assembly类访问程序集信息
C#中通过Assembly类可以访问程序集信息. 1.允许访问给定程序集的元元素,包含可以加载和执行程序集的方法; 2.加载程序集:使用静态方法Assembly.Load(程序集名称)或Assembly.LoadFrom(程序集完整路径名); 3.属性: FullName:程序集显示名称; 3.方法: Ge

.NET发展至今,其实各处都有“延迟(Lazy)”的痕迹,一个小小的“Laziness”给我们带来了不少灵活性1。“延迟”的关键就在于“只在需要的时候处理数据”,老赵曾经在多篇文章中提到了类似的概念,如《高阶函数、委托与匿名方法》及《您善于使用匿名函数吗?》。不过“延迟”本身也会给您带来一些陷阱,某些陷阱您很有可能也曾经遇到过。这篇文章便是总结了延迟特性的集中常见陷阱,并给出应对方案。

重复运算

问题

“延迟”的本意是“减少计算”,但是如果您使用不当,很可能反而会造成“重复计算”。例如,我们首先构建一个方法,它接受一个参数n,返回一个Func<int, bool>对象:

以下为引用的内容:

static Func<int, bool> DivideBy(int n)
{
    return x =>
    {
        bool divisible = x % n == 0;
        Console.WriteLine(
            "{0} can be divisible by {1}? {2}",
            x, n, divisible ? "Yes" : "No");
        return divisible;
    };
}

返回的Func<int, bool>对象会根据传入的参数x,返回一个表示x能否被n整除的布尔值。在这过程中,还会向控制台输出一句话,例如:“10 can be divisible by 3? No”。每当看到这句话,则表明“经过了一次判断”。那么您是否知道,下面的代码会输出什么结果呢?

以下为引用的内容:

List<int> values = new List<int>();
for (int i = 0; i < 10; i++) values.Add(i);

var divideByTwo = values.Where(DivideBy(2));
var divideByTwoAndThree = divideByTwo.Where(DivideBy(3));
var divideByTwoAndFive = divideByTwo.Where(DivideBy(5));

foreach (var i in divideByTwoAndThree) { }
foreach (var i in divideByTwoAndFive) { }

结果如下:

以下为引用的内容:

0 can be divisible by 2? Yes
0 can be divisible by 3? Yes
1 can be divisible by 2? No
2 can be divisible by 2? Yes
2 can be divisible by 3? No
3 can be divisible by 2? No
4 can be divisible by 2? Yes
4 can be divisible by 3? No
5 can be divisible by 2? No
6 can be divisible by 2? Yes
6 can be divisible by 3? Yes
7 can be divisible by 2? No
8 can be divisible by 2? Yes
8 can be divisible by 3? No
9 can be divisible by 2? No
0 can be divisible by 2? Yes
0 can be divisible by 5? Yes
1 can be divisible by 2? No
2 can be divisible by 2? Yes
2 can be divisible by 5? No
3 can be divisible by 2? No
4 can be divisible by 2? Yes
4 can be divisible by 5? No
5 can be divisible by 2? No
6 can be divisible by 2? Yes
6 can be divisible by 5? No
7 can be divisible by 2? No
8 can be divisible by 2? Yes
8 can be divisible by 5? No
9 can be divisible by 2? No

您是否发现,无论是在遍历divideByTwoAndThree和divideByTwoAndFive序列时,都会从原有的values序列里重新判断每个元素是否能够被2整除?这就是.NET 3.5中“Where”的延迟特性,如果您在这里没有意识到这点,就可能会产生重复计算,浪费了计算能力。

解决方案

解决这个问题的方法就是在合适的时候进行“强制计算”。例如:

以下为引用的内容:

var divideByTwo = values.Where(DivideBy(2)).ToList();
var divideByTwoAndThree = divideByTwo.Where(DivideBy(3));
var divideByTwoAndFive = divideByTwo.Where(DivideBy(5));

结果就变成了:

以下为引用的内容:

0 can be divisible by 2? Yes
1 can be divisible by 2? No
2 can be divisible by 2? Yes
3 can be divisible by 2? No
4 can be divisible by 2? Yes
5 can be divisible by 2? No
6 can be divisible by 2? Yes
7 can be divisible by 2? No
8 can be divisible by 2? Yes
9 can be divisible by 2? No
0 can be divisible by 3? Yes
2 can be divisible by 3? No
4 can be divisible by 3? No
6 can be divisible by 3? Yes
8 can be divisible by 3? No
0 can be divisible by 5? Yes
2 can be divisible by 5? No
4 can be divisible by 5? No
6 can be divisible by 5? No
8 can be divisible by 5? No

此时,在获得divideByTwo序列时,就会立即进行计算,这样在遍历后两者时就不会重复计算1,3,5等元素了。

异常陷阱

问题

请问您是否知道下面的代码有什么问题?

以下为引用的内容:

public static IEnumerable<string> ToString(IEnumerable<int> source)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }

    foreach (int item in source)
    {
        yield return item.ToString();
    }
}

如果您没有看出来的话,不如运行一下这段代码:

以下为引用的内容:

static void Main(string[] args)
{
    IEnumerable<string> values;
    try
    {
        values = ToString(null);
    }
    catch (ArgumentNullException)
    {
        Console.WriteLine("Passed the null source");
        return;
    }

    foreach (var s in values) { }
}

请问,运行上面的代码是否会抛出异常?从代码的意图上看,在ToString方法的一开始我们会检查参数是否为null,然后抛出异常——这本应被catch语句所捕获。但是事实上,代码直到foreach执行时才真正抛出了异常。这种“延迟”执行违反了我们的实现意图。为什么会这样呢?您可以使用.NET Reflector反编译一下,查看一下yield语句的等价C#实现是什么样的,一切就清楚了。

解决方案

对于这个问题,一般我们可以使用一对public和private方法配合来使用:

以下为引用的内容:

public static IEnumerable<string> ToString(IEnumerable<int> source)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }

    return ToStringInternal(source);
}

private static IEnumerable<string> ToStringInternal(IEnumerable<int> source)
{
    foreach (int item in source)
    {
        yield return item.ToString();
    }
}

不妨再去查看一下现在的C#代码实现?

资源管理

问题

由于是延迟执行,一些原本最简单的代码模式可能就破坏了。例如:

以下为引用的内容:

static Func<string> ReadAllText(string file)
{
    using (Stream stream = File.OpenRead(file))
    {
        StreamReader reader = new StreamReader(stream);
        return reader.ReadToEnd;
    }
}

使用using来管理文件的打开关闭是最容易不过的事情了,不过现在如果您通过ReadAllText(@"C:\abc.txt")方法获得的Func<string>对象,在执行时就会抛出ObjectDisposedException。这是因为原本我们意图中的顺序:

打开文件

读取内容

关闭文件

因为有“延迟”特性,这个顺序已经变为:

打开文件

关闭文件

读取内容

这怎么能不出错?

解决方案

有朋友说,这个容易:

以下为引用的内容:

static Func<string> ReadAllText(string file)
{
    using (Stream stream = File.OpenRead(file))
    {
        StreamReader reader = new StreamReader(stream);
        string text = reader.ReadToEnd();

        return () => text;
    }
}

的确没有抛出异常了,但是这也丧失了“延迟”的特点了。我们必须让它能够在调用委托对象的时候,才去打开文件:

以下为引用的内容:

static Func<string> ReadAllText(string file)
{
    return () =>
    {
        using (Stream stream = File.OpenRead(file))
        {
            StreamReader reader = new StreamReader(stream);
            return reader.ReadToEnd();
        }
    };
}

值得一提的是,using完全可以配合yield语句使用。也就是说,您可以编写这样的代码:

以下为引用的内容:

static IEnumerable<string> AllLines(string file)
{
    using (Stream stream = File.OpenRead(file))
    {
        StreamReader reader = new StreamReader(stream);
        while (!reader.EndOfStream)
        {
            yield return reader.ReadLine();
        }
    }
}

由此也可见C#编译器是多么的强大,它帮我们解决了非常重要的问题。

闭包共享

问题

其实这个问题也已经被谈过很多次了,在这里提一下主要是为了保持内容的完整性。您认为,以下代码结果如何?

以下为引用的内容:

List<Action> actions = new List<Action>();
for (int i = 0; i < 10; i++)
{
    actions.Add(() => Console.WriteLine(i));
}

foreach (var a in actions) a();

它打印出来的结果是10个10,具体原因在《警惕匿名方法造成的变量共享》一文中已经有过描述,概括而来便是:各个action共享一个闭包,导致其中的“i”并不是独立的。

解决方案

解决这个问题的方法,只需让不同闭包访问的值相互独立即可。如:

以下为引用的内容:

List<Action> actions = new List<Action>();
for (int i = 0; i < 10; i++)
{
    int  j = i; // 新增代码
    actions.Add(() => Console.WriteLine(j));
}

foreach (var a in actions) a();

关于“延迟”特性,您还有什么看法呢?

分享:解读Entity Framework的默认值BUG
前几天常使用.Net 3.5里的Entity Framework做个网站的时候,发现了一个问题:添加记录时,对于DateTime型的数据,无法使用数据库的默认值。 虽然不是什么严重的问题,但牛脾气上来了 ,就行解决这个问题。 具体的情况是这样的,我的数据库有个Users表,三个

来源:模板无忧//所属分类:.Net教程/更新时间:2009-07-11
相关.Net教程
闂傚倸鍊烽悞锕傛儑瑜版帒鏄ラ柛鏇ㄥ灠閸ㄥ倿姊洪鈧粔鐢稿磻閵堝鐓涢柛銉ㄥ煐缁舵稓绱撳鍡欏⒌闁哄本鐩崺鍕礃椤忎礁顫岄梻浣瑰▕閺€杈╂暜濡ゅ懎桅闁告洦鍨伴崡铏繆閵堝倸浜炬繛瀛樼矋閸庢娊鈥旈崘顔嘉ч煫鍥ㄦ礈鑲栭梻浣烘嚀閸ゆ牠骞忛敓锟�
婵犵數濮烽弫鎼佸磻濞戙埄鏁嬫い鎾跺枑閸欏繑銇勯幘鍗炵仼缁炬儳顭烽弻鐔兼倷椤掍胶浼囧┑鈩冨絻閻楁捇寮婚敓鐘茬<婵犻潧娲ㄩ妴濠冪節閳封偓閸曨厸濮囨繛锝呮搐閿曨亪骞婇悩娲绘晢濠㈣泛妫楁禍鐐節闂堟侗鍎愰柣鎾跺枛閺屾洝绠涙繝鍐╃彅闂佽绻戦悡锟犲蓟閻旂厧绀勯柕鍫濇椤忥拷
婵犵數濮烽弫鍛婃叏閻戝鈧倹绂掔€n亞鍔﹀銈嗗坊閸嬫捇鏌涢悢閿嬪仴闁糕斁鍋撳銈嗗笒鐎氬嘲螞閹寸姷纾奸弶鍫氭櫅娴犳粍銇勯幘鍐叉倯鐎垫澘瀚埀顒婄秵娴滄繈顢樻ィ鍐╃厽閹艰揪绲鹃崵鈧柣搴㈠嚬閸樼晫绮╅悢鐓庡耿婵炲棙鍔曟惔濠冪箾閹寸偞鐓g紒鑸靛哺瀵鏁愭径濠庢綂闂佸疇妗ㄩ懗鑸靛閸儲鈷戦柣鐔告緲濞堚晠鏌熼崙銈嗗
婵犵數濮烽弫鍛婃叏閻戝鈧倹绂掔€n亞鍔﹀銈嗗坊閸嬫捇鏌涢悢閿嬪仴闁糕斁鍋撳銈嗗笒鐎氬嘲螞閹寸姷纾奸弶鍫氭櫅娴犳粍銇勯幘鍐叉倯鐎垫澘瀚换婵嬪礋闂堟稒鍊梻鍌氬€峰ù鍥敋閺嶎厼鍨傞幖娣妼缁€瀣亜閹炬瀚呭鑸碘拻濞达絿鐡旈崵娆撴⒑鐢喚鍒板畝锝堝劵椤︽煡鎽堕悙瀵哥闁瑰瓨鐟ラ悘顏堟煕鐎n亶妯€闁哄被鍔戦幃銈夊磼濞戞﹩浼�
闂傚倸鍊搁崐鐑芥嚄閼哥數浠氱紓鍌欒兌缁垶宕濆▎鎾跺祦濠电姴鍟崕鐔兼煏婵炲灝鍔ら柛鏃撶畱椤啴濡堕崱妤冪懆闂佺ǹ锕ら幗婊堝极椤曗偓瀹曞ジ寮撮悙娈垮晣闂佽瀛╃粙鎺戠幓閸ф鍎楅柟鐑樻煛閸嬫挾鎲撮崟顒傤槰缂備浇顕ч悧鎾愁嚕椤愶箑绠荤紓浣股戝▍銏ゆ⒑鐠恒劌娅愰柟鍑ゆ嫹
闂傚倸鍊搁崐鐑芥嚄閼哥數浠氱紓鍌欒兌缁垶宕濆▎鎾跺祦濠电姴鍟崕鐔兼煏婵炲灝鍔ら柛鏃撶畱椤啴濡堕崱妤€娼戦梺绋款儐閹瑰洭寮诲☉姗嗘僵妞ゆ帒顦崜宕囩磽娓氬洤鏋涢柨鏇ㄤ邯瀵偊宕掗悙鑼槶閻熸粌绻橀幃锟犲箻缂佹ḿ鍘介柟鍏兼儗閸ㄥ啿鐣濆☉銏$厸闁告侗鍠氱粻鐐烘煙椤栨俺瀚伴柍璇查叄楠炲鎮╃喊澶岄棷婵犵數鍋為幐濠氭嚌妤e啯鏅濋柕澹偓閸嬫挸顫濋悙顒€顏�
闂傚倸鍊搁崐宄懊归崶顒€违闁逞屽墴閺屾稓鈧綆鍋呯亸浼存煏閸パ冾伃鐎殿喕绮欐俊姝岊槷婵℃彃鐗撳鐑樺濞嗗繒妲i梺闈╃秶缂嶄礁顕g拠娴嬫婵☆垶鏀遍弬鈧梻浣哥秺閸嬪﹥绂嶉悙鐑樺殑闁惧繐婀辩壕钘壝归敐澶嬫锭濠德ゅГ娣囧﹪鎮欓懜娈挎濡炪倖娲╃紞浣逛繆閹间礁鐓涘┑鐘插暞濞呮牗绻濋悽闈涗粶婵☆偅鐟╁畷褰掓偨閻㈢數鐣堕梺璺ㄥ枔婵敻鍩涢幋锔界厱婵犻潧妫楅鈺呮煃瑜滈崜娆撯€﹂悜鐣屽祦濠电姴娲ょ粻濠氭煠閸涘⿴鍟忔繛鑲╁枛濮婅櫣鎹勯妸銉︾彚闂佺懓鍤栭幏锟�
闂傚倸鍊搁崐椋庣矆娓氣偓楠炴牠顢曢敃鈧悿顕€鏌eΔ鈧悧濠囧矗韫囨搩娓婚悗锝庝簼閹癸絿绱掗埀顒佺節閸屻倗鍞甸梺鍏兼倐濞佳勬叏閸儲鐓熼柟鍨缁夘噣鏌熼娆炬綈婵炵⒈浜獮蹇撶暆婵犲倸韦濠电姷鏁搁崑娑㈡儑娴兼潙纾归柡鍥ュ灪缁犳帡姊绘担鐟邦嚋缂佽鍊歌灋婵炲棙鍨归惌鍡涙煃瑜滈崜鐔奉潖濞差亜宸濆┑鐐寸閸ㄥ潡骞冭閹晠鎳犻浣诡啎闂備浇顫夋竟鍡樻櫠濡ゅ懎鐤鹃柟闂寸劍閻撱儵鏌i弴鐐测偓鍦偓姘炬嫹
濠电姷鏁告慨鐑姐€傞挊澹╋綁宕ㄩ弶鎴濈€銈呯箰閻楀棛绮堥崼鐔虹瘈闂傚牊绋掗敍宥夋煟閺傛寧顥炲ǎ鍥э躬椤㈡稑顫濋浣糕偓顖炴煟鎼淬垺鐨戠紒顕呭灦婵$敻宕熼姘鳖啋闁诲酣娼ч幗婊堟偩濞差亝鐓熼幖娣灮閸熸煡鏌熼崙銈嗗
婵犵數濮烽弫鍛婃叏閻戝鈧倹绂掔€n亞鍔﹀銈嗗坊閸嬫捇鏌涢悢閿嬪仴闁糕斁鍋撳銈嗗笒鐎氬嘲螞閹寸姷纾奸弶鍫氭櫅娴犳粍銇勯幘鐐藉仮鐎规洖鐖兼俊鎼佸Ψ椤旇崵绌挎繝纰夌磿閸嬫垿宕愰弽顓炵闁煎鍊栧畷鏌ユ煕閹板吀绨撮柛瀣尭椤繈鎼归銈呮锭濠电儑绲藉ú銈夋晝椤忓牄鈧礁鈽夊Ο婊勬閸┾偓妞ゆ帊鐒﹀▍鐘绘煕濞嗗浚妲虹紒鈾€鍋撴俊鐐€ら崑鎺楀窗濡ゅ啠鍋撳鐐
濠电姷鏁告慨鐑姐€傞挊澹╋綁宕ㄩ弶鎴濈€銈呯箰閻楀棛绮堥崼鐔虹瘈闂傚牊绋掗敍宥夋煟閺傛寧顥為柟渚垮妼椤啰鎷犻煫顓烆棜闂佽姘﹂~澶娒洪敃鍌氱闁绘梻顑曢埀顑跨閳诲酣骞樺畷鍥舵Н闂備胶绮幐鍝ヨ姳閸洖纾婚柟鍓х帛閸嬨劑鏌涘☉姗堝姛闁告ɑ鎮傚娲礈閹绘帊绨肩紓浣筋嚙鐎氼剟鎮洪鐐╂斀闁绘ɑ鍓氶崯蹇涙煕閿濆骸鐏︽鐐茬箻閺佹捇鏁撻敓锟�
濠电姷鏁告慨鐑姐€傞挊澹╋綁宕ㄩ弶鎴濈€銈呯箰閻楀棛绮堥崼鐔虹瘈闂傚牊绋掗敍宥夋煟閺傛寧顥為柟渚垮妼椤啰鎷犻煫顓烆棜闂傚倷绀侀幖顐︽嚐椤栫偛绠犳慨妞诲亾鐎规洘妞介崺鈧い鎺嶉檷娴滄粓鏌熼崫鍕棞濞存粓绠栧铏光偓鍦閸ゆ瑩姊虹敮顔剧М闁绘侗鍣i獮瀣晝閳ь剛绮诲☉銏♀拻闁割偆鍠撻埊鏇熴亜閺傛寧顥㈡慨濠勭帛閹峰懘宕ㄦ繝鍐ㄥ壍闂佽瀛╃喊宥夊箖閸岀偟宓侀煫鍥ㄧ⊕閺呮悂鏌ㄩ悤鍌涘
濠电姷鏁告慨鐑姐€傞挊澹╋綁宕ㄩ弶鎴濈€銈呯箰閻楀棛绮堥崼鐔虹瘈闂傚牊绋掗敍宥夋煟閺傛寧顥為柟渚垮妼椤啰鎷犻煫顓烆棜闂佽姘﹂~澶娒洪埡鍐濞撴埃鍋撻柣娑卞枤閳ь剨缍嗘禍鏍绩娴犲鐓曟い鎰靛亜娴滄绱掗幉瀣
婵犵數濮烽弫鍛婃叏閻戝鈧倹绂掔€n亞鍔﹀銈嗗坊閸嬫捇鏌涢悢閿嬪仴闁糕斁鍋撳銈嗗笒鐎氬嘲螞閹寸姷纾奸弶鍫氭櫅娴犳粍銇勯幘鍐叉倯鐎垫澘瀚换婵嬪礋椤撶偛绠戦梻鍌氬€烽懗鍫曞箠閹剧粯鍋ら柕濞у嫬搴婇梺鍛婃处閸ㄥジ寮崒鐐村€垫繛鎴烆仾閼测晜宕查柛鈩兦滄禍婊堟煛瀹ュ海鍘涙繛鍫熸煥椤儻顦茬€殿喖澧庨幑銏犫攽鐎e墎绋忓銈嗘濡嫰顢旈敓锟�
闂傚倸鍊峰ù鍥敋瑜庨〃銉╁箹娴gǹ鍋嶅┑鐘诧工閻楀棛绮堥崼鐔虹瘈闂傚牊渚楅崕鎰版煕鐎n亶鍎旈柡宀€鍠栭獮鍡涙偋閸偅顥夐梻浣规た閸樹粙銆冮崨鏉戠厴闁硅揪闄勯崑鎰版煙缂佹ê绗氭繛鍫弮濮婄儤绺介崨濠冮敪缂傚倸绉撮敃顏勵嚕婵犳艾围濠㈣泛顑呭▓鐔兼⒑闂堟侗妲堕柛搴ㄤ憾閿濈偛顓兼径瀣ф嫼缂傚倷鐒﹀玻鎸庣珶閸曨厾纾界€广儱瀚ˇ锕傛煟閿濆懎妲婚柍璇查叄楠炴ḿ鈧稒蓱椤忕喖姊绘担鑺ョ《闁革綇绠撻獮蹇涙晸閿燂拷
UB闂傚倸鍊搁崐椋庣矆娴i潻鑰块弶鍫氭櫅閸ㄦ繃銇勯弽顐粶缂佲偓婢跺绻嗛柕鍫濇噺閸g晫鈧鎸风欢姘跺蓟濞戙垹唯闁靛繆鍓濋悵鏇㈡煟鎼淬垻顣茬€光偓閹间礁绠栨俊銈傚亾闁宠棄顦埢宥夋惞椤愩垻浼岄梺鎸庣箘閸嬨倝寮幘缁樻櫢闁跨噦鎷�
闂傚倸鍊搁崐宄懊归崶銊х彾闁割偆鍠嗘禒鍫㈢磼鐎n偒鍎ユ繛鍏肩墪閳规垿鎮╁畷鍥舵殹闂佺粯甯$粻鏍箖濡ゅ懏鍋ㄩ柣銏㈠仯閳ь剙锕弻娑氣偓锝庡亝瀹曞矂鏌e☉鍗炴珝鐎规洖缍婇、娆撳矗閵壯勶紡婵犵數濮烽弫鍛婃叏椤撱垹纾婚柟鍓х帛閻撱儵鏌i弴鐐测偓鍦偓姘炬嫹
闂傚倸鍊峰ù鍥敋瑜庨〃銉╁传閵壯傜瑝閻庡箍鍎遍ˇ顖炲垂閸岀偞鐓曟繝闈涙椤忕敻鏌ら弶鎸庡仴闁哄本鐩慨鈧柕蹇曞У椤旓拷
闂傚倸鍊搁崐椋庣矆娓氣偓楠炲鍨鹃幇浣圭稁缂傚倷鐒﹁摫闁告瑥绻愰—鍐偓锝庝簼閹癸絿绱掗埀顒佺節閸屻倗鍞甸柣鐘荤細濞咃綁鎮橀柆宥嗙厱婵°倓鑳堕。鑼磼缂佹ḿ娲寸€规洖宕灃闁逞屽墴椤㈡濮€閵堝棛鍘遍梺缁樺姇濡﹤危閸︻厾纾肩紓浣贯缚閵嗘帞绱掓潏銊ф噰闁诡喒鏅犲畷顐﹀礋椤愩垼鍘梻鍌氬€烽懗鑸电仚婵°倗濮寸换姗€鐛箛娑欐櫢闁跨噦鎷�
缂傚倸鍊搁崐鎼佸磹閹间礁纾归柣鎴eГ閸婂潡鏌ㄩ弴鐐测偓褰掑磻閿熺姵鐓ラ柡鍥╁仜閳ь剚鎮傚畷褰掑磼濞戞氨鐦堟繝鐢靛Т閸婃悂顢旈锝冧簻闁冲搫鎳忛弫閬嶆煏閸パ冾伃妤犵偞甯掗濂稿炊閼告晫婊呯磽閸屾瑧鍔嶇憸鏉垮暙閿曘垽鏌嗗鍛姦濡炪倖甯掗崐鍛婄椤栫偞鐓曞┑鐘插暟缁犳ḿ绱掓潏銊﹀碍妞ゎ偅绻冮敍鎰攽閸ャ劍鐝﹂梻鍌欐祰濞夋洟宕抽敃鍌氱闁跨噦鎷�
©2017 www.mb5u.com濠电姷鏁告慨鐑姐€傞挊澹╋綁宕ㄩ弶鎴濈€銈呯箰閻楀棛绮堥崼鐔虹瘈闂傚牊绋掗敍宥夋煟閺傛寧顥為柟渚垮妼椤啰鎷犻煫顓烆棜闂佽瀛╅鏍闯椤曗偓瀹曟娊鏁愭径濠勭暫闂佸啿鎼幊搴g不閻㈠憡鐓欓柣鎴炆戠亸顓㈡煟閿斿吋瀚�
闂傚倸鍊搁崐宄懊归崶顒€违闁逞屽墴閺屾稓鈧綆鍋呭畷宀勬煛瀹€鈧崰鏍€佸☉妯峰牚闁告劗鍋撳В澶嬩繆閻愵亜鈧垿宕曟繝姘闁跨噦鎷�&闂傚倸鍊搁崐椋庣矆娓氣偓楠炲鏁嶉崟顒佹闂佸湱鍎ら崵锕€鈽夐姀鐘电潉闂佸壊鍋嗛崳銉ノ涢崨瀛樷拺閻犳亽鍔屽▍鎰版煙閸戙倖瀚�
QQ缂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗〒姘e亾鐎殿喚鏁婚、妤呭焵椤掑嫧鈧棃宕橀钘夌檮婵犮垹鍘滈弲婊堟儎椤栫偛鏋侀柟鍓х帛閺呮悂鏌ㄩ悤鍌涘闂傚倸鍊搁崐椋庣矆娓氣偓楠炴牠顢曢敃鈧壕鍦磽娴h偂鎴濃枍閻樺厖绻嗛柕鍫濆€告禍鎯ь渻閵堝骸浜濈紒璇茬墦閵嗕礁鈻庨幋婵囩€抽梺鍛婎殘閸嬬偤顢欓崒娑楃箚闁绘劦浜滈埀顒佺墪椤繑绻濆顒€鍋嶉悷婊冪箻楠炲骞橀鑺ユ闂佽法鍣﹂幏锟�闂傚倸鍊搁崐鐑芥嚄閸洖鍌ㄧ憸鏃堝箖濡警娼╂い鎺戝€瑰▓鎯р攽椤斿浠滈柛瀣尰閵囧嫰濮€閿涘嫭鍣伴悗瑙勬礀瀹曨剝鐏冩繝鐢靛Т閸婂綊顢欓崒娑楃箚闁绘劦浜滈埀顒佺墪椤繑绻濆顒€鍋嶉悷婊冪箻楠炲骞橀鑺ユ闂佽法鍣﹂幏锟�婵犵數濮烽弫鎼佸磻濞戙垺鍋ら柕濞у啫鐏婇棅顐㈡处閹尖晛霉閺嶎厽鐓忓┑鐐茬仢閸撳墽鎲告惔鈽嗗殫闁告洦鍋嗛弳鍡涙煃瑜滈崜娑欑珶閺囩喆鍋呴柛鎰ㄦ櫇閸欏棝姊虹紒妯荤闁稿﹤婀遍埀顒佺啲閹凤拷闂傚倷娴囬褏鈧稈鏅犻、娆撳冀椤撶偟鐛ラ梺鍦劋椤ㄥ懐澹曟繝姘厵闁硅鍔曢崥褰掓煕濞嗘劖宕岄柡灞剧洴婵$兘骞嬪┑鍡樻濠电偛鐗嗘晶搴f閹捐纾兼慨妯诲閺嬪矂姊洪悷鏉挎闁瑰嚖鎷�闂傚倸鍊搁崐宄懊归崶顒佸剭妞ゆ劧绠戠粈瀣亜閹扳晛鐏╃悮姗€姊绘担绛嬪殭婵﹫绠撻敐鐐村緞鐎n剛顔曟繝鐢靛Т濞层劌鐣垫笟鈧弻鈥崇暤椤旂懓浜鹃梺鍓插亽娴滎亪寮诲☉銏犵労闁告劕銇樼欢闈涒攽閳藉棗浜鹃柟鍑ゆ嫹婵犵數濮烽弫鍛婃叏娴兼潙鍨傞柣鎾崇岸閺嬫牗绻涢幋鐐寸殤闁活厽鎹囬弻鐔虹磼閵忕姵鐏堥梺鍝勫閸庡弶绌辨繝鍥ч柛娑卞幗濞堝墎绱掓ィ鍐暫缂佺姵鐗犲濠氭偄鐞涒€充壕婵炴垶鐟$紓姘辩磼閻樺磭澧辩紒杈ㄥ笧閹风姾顦抽悗姘炬嫹闂傚倸鍊搁崐椋庣矆娓氣偓楠炴牠顢曢埛姘そ閺佸啴鍩€椤掆偓閻滃宕归瑙勭€婚梺瑙勫劤缁夋潙煤椤撱垹鏋侀柟鍓х帛閺呮悂鏌ㄩ悤鍌涘...