《深入理解C#(第2版)》的原文摘录

  • 当有多个类型参数时,可以用一个适合整个类型含意的单词来分隔它们,例如,我会使用dictionary of string to int来强调映射的部分,而不会使用tuple of string and int。 (查看原文)
    skyivair 1回复 2012-04-14 06:46:49
    —— 引自第54页
  • When there are multiple type parameters, I find it makes sense to separate them with a word appropriate to the meaning of the overall type—so I’d talk about a “dictionary of string to int” in order to emphasize the mapping aspect, but a “tuple of string and int.” (查看原文)
    skyivair 1回复 2012-04-14 06:46:49
    —— 引自第54页
  • ...如果仅仅是接受目标的实现,而不去明确定义从哪里开始,那么一切就没有问题,至少在出错前没什么问题。 如果想弄明白究竟发生了什么才能达到预期效果,事情就变得有点棘手了。既然本书挂着“深入理解”的名头,那么我就假设你想知道这些细节。最终,我保证你在用 await 时会更加自信,并且更加高效。 即便如此,我还是建议各位根据自身情况,在两个不同级别发展阅读异步代码的能力。如果无须理解这里列出的单独步骤,就让它们随风而去好了。你可以像阅读同步代码那样去阅读异步代码,只需留意代码异步等待某些操作完成时的位置即可。然后,当遇到代码不按预期执行这种棘手问题时,可深入研究一下哪些地方涉及了哪些线程,以及调用栈在任意时间点的样子。(我并没有说这很简单,但理解其机制至少会对我们有所帮助。) (查看原文)
    LiXiaNG 2017-08-20 12:49:58
    —— 引自第418页
  • 那么,要如何实现GetEnumerator方法呢?首先要知道,我们需要在某个地方存储某个状态。迭代器模式的一个重要方面就是,不用一次返回所有数据——调用代码一次只需获取一个元素。这意味着我们需要确定访问到了数组中的哪个位置。在了解C# 2编译器为我们所做的事情时,迭代器的这种状态特质十分重要,因此,要密切关注本例中的状态。 那么,这个状态值要保存在哪里呢?假设我们尝试把它放在IterationSample类自身里面,让它既实现IEnumerator接口又实现IEnumerable接口。乍一看,这似乎是个好主意—— 毕竟,我们是将数据保存在正确的位置,其中也包括了起点。GetEnumerator方法可以仅返回 this。然而,使用这种方式存在一个大问题——如果GetEnumerator方法被调用了多次,那么 就会返回多个独立的迭代器。例如,我们能使用两个嵌套的foreach语句,以便得到所有可能的成对值。这就意味着,两个迭代器需要彼此独立,每次调用GetEnumerator方法时都需要创建一个新对象。我们仍可以直接在IterationSample内部实现功能,不过只用一个类的话,分工就不明确——那样会让代码非常混乱。 因此,可以创建另外一个类来实现这个迭代器。 (查看原文)
    国士无双 2017-11-20 18:59:14
    —— 引自第143页
  • 我是那种为了在圣诞节到来那一刻尽早打开礼物,宁愿在平安夜熬到凌晨不睡的人。同样,我(这种迫不及待的人)也不可能在向大家展示简洁的C# 2解决方法之前,浪费过多的时间。 (查看原文)
    国士无双 2017-11-20 20:08:07
    —— 引自第144页
  • 这个结果中有几个重要的事情需要牢记: 在第一次调用MoveNext之前,CreateEnumerable中的代码不会被调用; 所有工作在调用MoveNext时就完成了,获取Current的值不会执行任何代码; 在yield return的位置,代码就停止执行,在下一次调用MoveNext时又继续执行; 在一个方法中的不同地方可以编写多个yield return语句; 代码不会在后的yield return处结束,而是通过返回false的MoveNext调用来结束方法的执行。 第一点尤为重要,因为它意味着如果在方法调用时需要立即执行代码,就不能使用迭代器块, 如参数验证。如果你将普通检查放入用迭代器块实现的方法中,将不能很好地工作。你肯定会在某些时候违反这些约束——这是十分常见的错误,而且如果你不知道迭代器块的原理,也很难理解为什么会这样。 (查看原文)
    国士无双 2017-11-21 22:15:13
    —— 引自第148页