【C# in depth 第三版】温故而知新(1)

声明


本文欢迎转载原文地址:http://www.cnblogs.com/DjlNet/p/7192354.htmlhtml


前言


关于这本书(《深刻理解C# 第三版》)的详细状况以及好坏,自行搜索便可,我就不啰里啰嗦的,此文责在备份,意在记录一下第二次阅读当中发现原先囫囵吞枣之处,也为了记忆深入吧。对这里还有一本《Clr via C# 第四版》也准备二次阅读,关于精度细读章节,知乎传送门( 赵姐夫的回答 ): https://www.zhihu.com/question/27283360。就在昨天(9月9号)北京和上海相继展开了技术分享会(有同步直播),这里要给北京的sqlserver演讲的老哥点赞,讲得不错挺落地和实在的,还有上海的分享的【.Net 微服务实战】,看了内心挺有感触的,并非说从知识或者实践的层面领悟到有多少有多少,而是理解和明白这玩意儿为什么而生,培养一点大局观和思惟套路吧,毕竟在DDD、微服务大行其道的今天只有不断学习,而后温故而知新,可能才能知道它们想表达的含义吧!sql


这些知识你还记得么吗,\(^∀^)メ


上面扯了一些口水话,其实在学习偏架构的知识时候,那么必经之路即是对语言基础的足够掌握以及对上层框架的理解掌握,那么今天再去扯架构和框架以前就来回顾一下关于语言的一些小知识,如下是在下记录一些书中查漏补缺自我的备份记忆使用,其中可能也包含如下不经常使用或者小知识,大神大佬请自动忽略 ,哈哈。架构


误区:对象在C#中默认是经过引用传递的

我这里摘录引用书中部分描叙:首先“引用传递”的正式定义至关复杂,要涉及左值和相似的计算机科学术语,可是最重要的一点是,假如以引用传递的方式来传递一个变量,那么调用的方法能够经过更改其参数值,来改变调用者的变量值(说到这里有木有想到 ref out 关键字,是的它们就能够达到引用传递的效果)。那么默认状况,就是没有显示使用关键词的状况,引用类型变量的值才是引用(相似: 0x12345678 这种),而不是对象自己,且不须要按引用来传递参数自己,就能够更改该参数引用的那个对象的内容。例如:下面的方法更改了相关对象StringBuilder的内容,可是调用者的表达式引用的仍然是以前的那个对象:框架

void AppendHello(StringBuilder builder)
{
    builder.Append("Hello");
}

调用这个方法时,参数值(对StringBuilder的一个引用)是以值传递的方式传递的。若是想在方法内部更改builder的变量值,如:builder=null;对调用者来讲是看不见的。异步


理解:JIT编译器如何处理泛型

对于全部的封闭类型,JIT的职责就是将泛型类型的IL转换为本地代码,咱们以List 做为例子,首先JIT为每一个以 值类型做为类型实参的封闭类型都建立不一样的代码,理论上对于一些值类型来讲,代码是能够共享的,可是JIT必须十分谨慎,不只须要考虑空间大小的问题,还要考虑垃圾回收的问题,因此第一次建立独享的代码。那么,全部使用引用类型(string、stream、stringbuilder等)做为类型实参的封闭类型都共享相同的本地代码,之因此能够这样作,是因为 全部引用都具备相同的大小(32位CLR上是4个字节,64位CLR是8个字节,在任何一个特定的CLR中全部引用具备相同的大小)。关于泛型的新增API, GetGenericTypeDefinition做用于已构造的类型,获取它的泛型类型定义和 MarkGenericType做用于泛型类型的定义,返回一个已构造类型,诸如此类还有: GetGenericArguments、IsGenericTypeDefinition、IsGenericType、MarkGenericMethod、IsGenericMethod等等。 async


Nullable 类型理解与使用null进行赋值和比较原理

注意Nullable 是一个结构也就是 值类型,对于例如Nullable 的变量来讲,直接包含了一个bool和一个int成员,而不是其余对象的引用。关于null赋值比较,原理:C#编译器容许使用null在比较和赋值时表示一个可空类型的空值。其中这样来处理的缘由,相信也是从语言层面让语义更加符合天然逻辑,得到和引用类型null的一样体验。那么到底编译器关于可空值类型帮咱们作了什么呐, int? a=null; if(a==null){ .... },与null比较其实在编译器生成IL代码中,被转换为调用 a.HasValue,对a赋值为null,其实也是调用了Nullable 的构造函数建立一个空值实例而已,注意直接调用a.Value在没有真正的值提供时将会抛出异常。 函数


注意匿名函数变量捕获

划重点:
一、捕获的是变量自己,而不是建立委托实例时它的值
二、捕获的变量的生存周期被延长了,至少和捕获它的委托同样长
三、多个委托能够捕获同一个变量
四、在循环内部,同一个变量声明实际上会引用不一样的变量“实例”(这点在R#也会提示开发者)
五、若是捕获的变量不会发生改变,就不须要担忧
六、在C#5或者以上修正foreach的表达含义,可是for依然须要注意。微服务


理解Yield的工做流程和成为奠基异步Async/Await的设计基石

这里直接引用书中的代码增强记忆和再次熟悉下流程,以下图所示代码:

关于代码的执行流程那得自个儿看看,慢慢跟着执行流程,相信就能明白Yield在代码执行中起到的做用,就貌似能在不一样的方法之间跳跃,总的来讲能够归为几点:
一、在第一次调用MoveNext以前,CreateEnumerable中的代码不会被调用
二、全部工做在调用MoveNext时就完成了,获取Current的值不会执行任何代码
三、在yield return的位置,代码会中止执行,方法暂时返回调用者方法,在下一次执行MoveNext时有继续在下一行代码继续执行
四、在一个方法中的不一样位置能够编写多个yield return语句
五、代码不会在最后的yield return处结束而是经过返回false的MoveNext调用来结束方法的执行
上面说了这么多,在看到第3和4点的时候有没有感受到await的部分做用似曾相识,await也可让方法返回并且能够等在那里等到结果拿到以后接着那个“断点”继续执行,并且在一个Async标记的异步方法中能够,有多个await的拆包操做,因此在必定程度上面yield在思想和设计层面上,给后面的C#5的异步埋下了铺垫。从状态机的角度来看(这块并非很熟悉,因此说错了,请斧正)在C#5中为迭代器块而生成的状态机和那些异步函数而生成的状态机之间的类似性是惊人的。异步开发中两个复杂的问题就是:一、处理状态 二、在感兴趣的事情发生以前进行有效的暂停,迭代器使得这两个问题得以完美的解决。 这里提供一下yield实现异步的伪代码,也是书中的代码片断:(伪代码是基于CCR实现的,主要是明白它想传递表达的意思,便可代码部分看看就好)sqlserver

static IEnumerator<ITask> ComputeTotalStockVal.(str.user,str.pass)
{
        string token=null;
        yield return Arbiter.Receive(false,AuthService.CcrCheck(user,pass),
            delegate(string t){ token=t; });
        IEnumerable<Holding> stocks=null;
        IDictionary<string,decimal> rates=null;
        yield return Arbiter.JoindReceive(false,
            DbService.CcrGetStockHoldings(token),
            StockService.CcrGetRate(token),
            delegate(IEnumerable<Holding> s,IDictionary<string,decimal> r)
            {
                stocks=s;
                rates=r;
            });
        OnRequestComplete(ComputeTotal(stocks,rates));
}

大体对上面代码作个解释说明虽然是伪代码,CCR对咱们的代码进行了调用也就是调用MoveNext,第一个yield return才会执行,AuthService里面的CcrCheck方法启动一个异步请求,CCR会等待直到它完成,而后提供给它的委托来处理拿到的结果也就是token,而后接着再次调用MoveNext,方法接着执行,JoindReceive并行启动两个异步请求,在两个请求都完成的状况下,利用后续的委托去处理结果,在这以后MoveNext再次调用,就完成了所有的请求处理了。学习


小总结

再回看一些基础知识的时候,才发觉原来语言层面的设计不比一些高层架构的设计的重要性和观赏性差(虽然没什么可比性,哈哈),好了,天不早了,后面应该会出续篇,等这个完了以后,应该会开始对一些你们关注的点出发,脚踏实地的从代码、需求和设计层面考虑去写一些可以使用的代码片断或者程序设计,用做之后参考或者借鉴。最最后,好好给本身一记耳光,咋就作人真懒呐,看看离上次发文都多长时间了,送给本身的话:从如今起作一个不那么懒的人吧!谨记!!!

相关文章
相关标签/搜索