随笔分类 - EffectiveC#
摘要:1..Net框架提供了接口来描述对象的顺序关系:IComparable 和IComparer。2.IComparable 为类定义了自然顺序,实现IComparer接口的类可以描述其它可选的顺序3.原因:避免在运行时默认比较关系的低效4.IComparable接口只有一个方法:CompareTo()...
阅读全文
摘要:1.回调的场景:我给了儿子一个任务且他可以报告状态来(重复的)打断我。而我在等待他完成任务的每一个部份时不用阻塞我自己的进程。他可以在有重要(或者事件)状态报告时,可以定时的打断我,或者向我询求帮助我:“儿子,到院子里除草去,我要看会书。” 斯科特:“爸,我已经打扫过院子了。” 斯科特:“爸,我已经...
阅读全文
摘要:1.建议避免使用new修饰符来重新定义非虚函数。 非虚方法是静态绑定的,不管哪里的代码也不管在哪里引用, 它总是严格的调用类中所定义的函数。并不会在运行时在派生类中查找不同的版本.2.何时使用new?基类与派生类都已经存在了,是后来添加的继承关系,结果在添加继承关系时,发现两个类中使用了同样的方法名...
阅读全文
摘要:此篇是对00中第3点的再一次阐述。1.如果一个属性返回一个引用类型,那么调用者就可以访问这个对象的公共成员,也包括修改这些属性的状态。public class MyBusinessObject { // Read Only property providing access to a privat...
阅读全文
摘要:1.继承就是说它是某物(is a的关系),针对相关类,而接口是说它有某个功能(behaves like.)可以是不相关的 基类是描述对象是什么,接口描述对象有某种行为。2.不能在接口里提供任何成员的具体实现.只是定义属性,事件和索引器等。抽象基类可以为派生类提供一些具体的实现,另外也描述了一些公共的...
阅读全文
摘要:1.如下这段代码会经历装箱和拆箱。例如25会先装箱成object后传递给writeline方法(一次拷贝),在方法内部又经历拆箱成int(第二次拷贝)后然后调用tostring().Console.WriteLine("A few numbers:{0}, {1}, {2}", 25, 32, 50...
阅读全文
摘要:1.申请和释放一个基于堆内存的对象要花上更多的处理器时间。 所以当一个引用类型的局部变量在常规的函数调用中使用的非常频繁时应该把它提升为对象的成员(方法一)2.当你把一个实现了IDisposable接口的局部变量提升为类型成员时,例如字体或连接,你的类同样也应该实现IDisposable接口(见原则...
阅读全文
摘要:1.任何时候你在使用一个有Dispose()方法的类型时,你就有责任来调用Dispose()方法来释放资源。 最好的方法来保证Dispose()被调用的结构是使用using语句或者try/finally块public void ExecuteCommand( string connString, s...
阅读全文
摘要:1.在一个类里声明变量的同时,直接创建实例值.包括静态的和实例的变量例:object m_o = new object(); 如下情况时不建议这么做:第一种 值类型。int i=new int();//会产生装箱 第二种。两个构造函数。对此种情况你有可能有疑问,你不是建议初始化吗?为什么这里不推荐...
阅读全文
摘要:1.C#的foreach语句可以为你的任何集合产生最好的迭代代码 不推荐如下写法(?原因未明白 作者意思是阻碍jit边界检测)int len = foo.Length; for ( int index = 0; index < len; index++ ) Console.WriteLine( fo...
阅读全文
摘要:1.当你创建你自己的类型时(不管是类还是结构),你要定义类型在什么情况下是相等的。C#提供了4个不同的方法来断定两个对象是否是相等的public static bool ReferenceEquals ( object left, object right ); public static bool...
阅读全文
摘要:1.决不要创建一个不包括0在内的枚举类型2.举例如下:public enum Planet { Mercury = 1, Venus = 2, Earth = 3, Mars = 4, Jupiter = 5, Saturn = 6, Neptune = 7, Uranus = 8, Pluto ...
阅读全文
摘要:1.恒定类型就是一但它们被创建,它们(的值)就是固定的. 恒定类型可以很好的在基于哈希代码的集合上工作。以Object.GetHashCode()方法返回的值,对同一个实例是必须相同的2.一个客户类型就不是原子类型;它是由多个不同的恒定的组成部份构成的:地址,名字以及一个电话号码集合。3. 可变类型...
阅读全文
摘要:1.设计一个类型时,选择struct或者class是件简单的小事情,但是,一但你的类型发生了改变,对所有使用了该类型的用户进行更新却要付出(比设计时)多得多的工作.2.值类型:无多态但性能佳。 值类型(结构)存储数据,而引用类型(类)表现行为或职责。3.public class C { privat...
阅读全文
摘要:1.System.Object版的ToString()方法只返回类型的名字2.知道要重写它,返回更有意义的信息,最好是提供几个重载版本.3.当你设计更多的复杂的类型时(格式化文本)应该实现应变能力更强的IFormattable.ToString()4.例子public class Customer ...
阅读全文
摘要:1.用as运算符进行类型转换。因为比起盲目的强制转换它更安全,而且在运行时效率更高。 安全体现在:as操作符就算是转化一个null的引用时,也会安全的返回一个null而不会像强制转换抛出异常。2.as和is运算符在运行时要检测转换目标的类型。如果一个指定对象不是要求转换的类型,或者它是从要求转换类型...
阅读全文
摘要:1.对于常量,C#里有两个不同的版本: 编译时常量--效率相比更高些,但可维护性不好,保留的目的是为了性能。const关键字申明 public const int _Millennium = 2000; 运行时常量--效率稍低些,可维护性好。readonlyc关键字声明,也叫只读变...
阅读全文
摘要:1.属性可以进行数据绑定2.可以做数据安全校验。在对数据检测时,如果发现数据不满足条件,最好以抛出异常的形式来解决 如下代码不可取public string Name{ get { if(this._Name==null) { return “NoNam...
阅读全文

浙公网安备 33010602011771号