建议102:区分接口和抽象类的应用场合接口和抽象类有一些显而易见的区别:接口支持多继承,抽象类则不能。接口可以包含方法、属性、索引器、事件的签名,但不能有实现,抽象类则可以。接口在增加新方法后,所有的继承者都必须重构,否则编译不通过,而抽象类则不需要。这些区别导致两者的应用场景不同:如果对象存在多个...
建议100:静态方法和实例方法没有区别静态方法在加载时机和内存使用上和实例方法完全一致。在这里,我们先引出一个概念“类型对象”。比如类型Person,我们都知道new Person() 会产生一个对象,这个对象叫做“实例对象”,它在运行时会加载到GC Heap上。而“类型对象”是指代表Person类...
建议101:使用扩展方法,向现有类型“添加”方法考虑如何让一个sealed类型具备新的行为。以往我们会创建一个包装器类,然后为其添加方法,而这看上去一点儿也不优雅。我们也许会考虑修改设计,直接修改sealed类型,然后为其发布一个新的版本,但这依赖于你拥有全部的源码。更多的时候,我们会采取针对第三方...
建议93:构造方法应初始化主要属性和字段类型的属性应该在构造方法调用完毕前完成初始化工作。如果字段没有在初始化器中设置初始值,那么它就应该在构造方法中初始化。类型一旦被实例化,那么它就应该被视为具有完整的行为和属性。 class Company { Employee spe...
建议92:谨慎将数组或集合作为属性数组或集合作为属性会引起这样一个问题:如果属性是只读的,我们通常会认为它是不可用改变的,但如果将只读属性应用于数座或集合,而元素的内容和数量却仍旧可以随意改变。如下所示: static void Main(string[] args) {...
分类:
编程语言 时间:
2015-08-20 15:04:33
阅读次数:
122
建议91:可见字段应该重构为属性字段和属性的本质区别就是属性是方法。查看下面这个Person类型: class Person { public string Name { get; set; } }经过编译器编译后,针对属性Name实际会生成一个private字段和两...
建议90:不要为抽象类提供公开的构造方法首先,抽象类可以有构造方法。即使没有为抽象类指定构造方法,编译器也会为我们生成一个默认的protected的构造方法。下面是一个标准的最简单的抽象类: abstract class MyAbstractClass { protecte...
建议85:Task中的异常处理在任何时候,异常处理都是非常重要的一个环节。多线程与并行编程中尤其是这样。如果不处理这些后台任务中的异常,应用程序将会莫名其妙的退出。处理那些不是主线程(如果是窗体程序,那就是UI主线程)产生的异常,最终的办法都是将其包装到主线程上。在任务并行库中,如果对任务运行Wai...
建议89:在并行方法体中谨慎使用锁除了建议88所提到的场合,要谨慎使用并行的情况还包括:某些本身就需要同步运行的场合,或者需要较长时间锁定共享资源的场合。在对整型数据进行同步操作时,可以使用静态类Interlocked的Add方法,这就极大地避免了由于进行原子操作长时间锁定某个共享资源所带来的同步性...
建议87:区分WPF和WinForm的线程模型WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button、TextBox等)必须由创建它的那个线程进行更新。WinForm在这方面的限制并不是很严格,所以像下面这样的代码,在WinForm中大部分情况下还能运行(本建议后面会详细解释...
分类:
编程语言 时间:
2015-08-19 23:20:40
阅读次数:
210