摘要: C#的foreach语句不仅仅只是do...while或者for循环语句的一个变体。它会为我们的集合产生最好的遍历代码。实际上,foreach语句的定义和.NET框架中的集合接口密切相关。对于一些特殊的集合类型,C#编译器会产生具有最佳效率的代码。遍历集合时,我们应该使用foreach语句,而非其他的循环构造。例如,对于下面三种循环:条款11:优先采用foreach循环语句 70 int []... 阅读全文
posted @ 2007-07-09 10:39 四两 阅读(286) 评论(0) 推荐(0) 编辑
摘要: 本条款讨论函数GetHashCode()的缺陷,这种情况在全书中是唯一的。幸运的是,GetHashCode()函数只应用在一个地方:为一个基于散列(hash)的集合定义键的散列值,典型的集合为Hashtable或Dictionary容器。因为基类的GetHashCode()实现有很多问题。对引用类型来讲,它可以正常工作,但是效率很低。对于值类型来讲,基类中的实现通常是不正确的。更为糟糕的是,我们编... 阅读全文
posted @ 2007-07-09 10:38 四两 阅读(269) 评论(0) 推荐(0) 编辑
摘要: 当我们创建自己的类型时(无论是类还是结构),可以为类型定义“相等判断”的含义。C#提供了四种不同的函数来判断两个对象是否“相等”:public static bool ReferenceEquals ( object left, object right );public static bool Equals ( object left, object right );public virtu... 阅读全文
posted @ 2007-07-09 10:37 四两 阅读(336) 评论(0) 推荐(0) 编辑
摘要: .NET系统的默认初始化机制会将所有的对象设置为0[14]。对于值类型来讲,我们无法阻止其他程序员将其所有的成员都初始化为0[15]。因此,我们应该将0作为值类型的默认值。枚举类型就是一种典型的情况。我们创建的枚举类型决不应该将0视为无效状态。我们知道,所有的枚举类型都继承自System.ValueType。默认的枚举值从0开始,但是我们可以更改这种默认行为。public enum Planet{... 阅读全文
posted @ 2007-07-09 10:36 四两 阅读(131) 评论(0) 推荐(0) 编辑
摘要: 具有常量性的类型很简单,它们自创建后便保持不变。如果在构造的时候就验证了参数的有效性,我们就可以确保从此之后它都处于有效的状态。因为我们不可能再更改其内部状态。通过禁止在构建对象之后更改对象状态,我们实际上可以省却许多必要的错误检查。具有常量性的类型同时也是线程安全的:多个reader可以访问同样的内容。因为如果内部状态不可能改变,那么不同线程也就没有机会获得同一数据的不同值。具有常量性的类型也可... 阅读全文
posted @ 2007-07-09 10:36 四两 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 值类型还是引用类型?结构还是类?如何正确地使用它们?这里不是C++,在那里,所有的类型都被我们定义为值类型,然后我们可以选择创建它们的引用形式。这也不是Java,在那里,所有的类型都是引用类型[9]。在C#中,我们必须在设计类型的时候就决定类型实例的行为。这种决定非常重要。我们必须清楚这种决定的后果,因为后期的更改会导致许多代码在不经意间出现错误。在创建类型的时候选择struct或class关键字... 阅读全文
posted @ 2007-07-09 10:35 四两 阅读(139) 评论(0) 推荐(0) 编辑
摘要: System.Object.ToString()恐怕是.NET中最常用的方法了。应该为我们的类的所有客户代码提供一个合理的版本,否则这些代码就只能使用我们的类的一些属性来自己定制可读的表示了。类型的字符串表示非常有用,可以在很多地方向用户显示对象的有关信息,例如在Windows Forms上、Web Forms上、控制台输出窗口中,以及调试环境中。为此,我们创建的每一个类型都应该重写Object类... 阅读全文
posted @ 2007-07-09 10:34 四两 阅读(233) 评论(0) 推荐(0) 编辑
摘要: #if/#endif条件编译常用来由同一份源代码生成不同的结果文件,最常见的有debug版和release版。但是,这些工具在具体应用中并不是非常得心应手,因为它们太容易被滥用了,使用它们创建的代码通常都比较难理解,且难以调试。C#语言的设计者们对这种问题的解决方案是创建更好的工具,以达到为不同环境创建不同机器码的目的。C#为此添加了一个Conditional特性,该特性可以标示出某种环境设置下某... 阅读全文
posted @ 2007-07-09 10:33 四两 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 使用const较之于使用readonly的唯一好处就是性能:使用已知常量值的代码效率要比访问readonly值的代码效率稍好一点。但是这其中的效率提升是非常小的,大家应该和其所失去的灵活性进行一番权衡比较。在打算放弃灵活性之前,一定要对两者的性能差别做一个评测。综上所述,只有当某些情况要求变量的值必须在编译时可用,才应该考虑使用const,例如:特性(attribute)类的参数,枚举定义,以及某... 阅读全文
posted @ 2007-07-09 10:32 四两 阅读(172) 评论(0) 推荐(0) 编辑
摘要: C#语言有两种不同的常量机制:一种为编译时(compile-time)常量,一种为运行时(runtime)常量。两种常量有着非常迥异的行为,使用不正确会导致程序的性能下降或者出现错误。这两种代价,哪一个都没有人愿意承担,但是如果必须承担一个,那么“慢、但是能够正确运行的”程序总比“快、但是可能出错的”程序要好。因此,我们说运行时常量优于编译时常量。编译时常量比运行时常量稍微快一点,但却缺乏灵活性。... 阅读全文
posted @ 2007-07-09 10:32 四两 阅读(196) 评论(0) 推荐(0) 编辑
摘要: 为什么程序已经可以正常工作了,我们还要改变它们呢?答案就是我们可以让它们变得更好。我们常常会改变所使用的工具或者语言,因为新的工具或者语言更富生产力。如果固守旧有的习惯,我们将得不到期望的结果。对于C#这种和我们已经熟悉的语言(如C++或Java)有诸多共通之处的新语言,情况更是如此。人们很容易回到旧的习惯中去。当然,这些旧的习惯绝大多数都很好,C#语言的设计者们也确实希望我们能够利用这些旧习惯下... 阅读全文
posted @ 2007-07-09 10:31 四两 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 本书就如何高效使用C#语言和.NET库,为程序员们提供了一些实用的建议。本书由50个关键条款(也可看作是50个小主题)组成,这些主题反映了我(及其他C#顾问)和C#开发人员共事时遇到的最常见问题。与很多C#开发人员一样,我是在从事10多年C++开发之后开始使用C#的。在本书中,讨论了哪些情况下遵循C++实践可能会在使用C#时引发的问题。有一些使用C#的开发人员有着深厚的Java背景,他们可能会发现... 阅读全文
posted @ 2007-07-09 10:29 四两 阅读(123) 评论(0) 推荐(0) 编辑
摘要: 第1章 C#语言元素...... 1条款1:使用属性代替可访问的数据成员.. 1条款2:运行时常量(readonly)优于编译时常量(const).. 12条款3:操作符is或as优于强制转型.. 17条款4:使用Conditional特性代替#if条件编译.. 25条款5:总是提供ToString()方法.. 31条款6:明辨值类型和引用类型的使用场合.. 38条款7:将值类型尽可能实现为具有... 阅读全文
posted @ 2007-07-09 10:28 四两 阅读(88) 评论(0) 推荐(0) 编辑
摘要: 引言:-------------------------------------------------------------------------------------------------------------------------------现实生活中要想查字典中的数据就需要一个方法 即通过“拼音”查“汉字”等。 而在计算机字典中 要想获取字典中数据的位置是很难的... 阅读全文
posted @ 2007-07-09 10:23 四两 阅读(2089) 评论(0) 推荐(0) 编辑
加油,哥们,现在开始!