上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 14 下一页
摘要: 建议101:使用扩展方法,向现有类型“添加”方法考虑如何让一个sealed类型具备新的行为。以往我们会创建一个包装器类,然后为其添加方法,而这看上去一点儿也不优雅。我们也许会考虑修改设计,直接修改sealed类型,然后为其发布一个新的版本,但这依赖于你拥有全部的源码。更多的时候,我们会采取针对第三方... 阅读全文
posted @ 2015-08-20 17:41 JesseLZJ 阅读(600) 评论(0) 推荐(0) 编辑
摘要: 建议100:静态方法和实例方法没有区别静态方法在加载时机和内存使用上和实例方法完全一致。在这里,我们先引出一个概念“类型对象”。比如类型Person,我们都知道new Person() 会产生一个对象,这个对象叫做“实例对象”,它在运行时会加载到GC Heap上。而“类型对象”是指代表Person类... 阅读全文
posted @ 2015-08-20 17:08 JesseLZJ 阅读(783) 评论(0) 推荐(0) 编辑
摘要: 建议99:重写时不应使用子类参数重写时,如果使用了子类参数,可能会偏离设计者的预期目标。比如,存在一个如下继承体系: class Employee { } class Manager : Employee { }现在,类型ManagerSalary中的SetSal... 阅读全文
posted @ 2015-08-20 16:13 JesseLZJ 阅读(481) 评论(0) 推荐(0) 编辑
摘要: 建议98:用params减少重复参数如果方法的参数数目不定,且参数类型一致,则可以使用params关键字减少重复参数声明。 void Method1(string str, object a){} void Method2(string str, object a,obj... 阅读全文
posted @ 2015-08-20 16:01 JesseLZJ 阅读(390) 评论(0) 推荐(0) 编辑
摘要: 建议97:优先考虑将基类型或接口作为参数传递除了公开及类型或接口外,方法的参数也应该考虑基类型或接口。以Enumerable类型为例,它的成员方法中只要涉及需要操作集合对象的地方,都要使用IEnumerable泛型接口,比如:public static IEnumerable Take(this I... 阅读全文
posted @ 2015-08-20 15:55 JesseLZJ 阅读(315) 评论(0) 推荐(0) 编辑
摘要: 建议96:成员应优先考虑公开基类型或接口类型成员如果优先考虑公开及类型或接口,那么会让类型支持更多的应用场合。FCL中最典型的例子是集合的功能操作。集合根据功能划分有多种类型,比如List、Dictionary、HashSet等。以一个最简单的操作Empty(清空集合)为例。该功能要求我们删除集合中... 阅读全文
posted @ 2015-08-20 15:46 JesseLZJ 阅读(329) 评论(0) 推荐(0) 编辑
摘要: 建议95:避免在构造方法中调用虚成员在构造方法中调用虚方法会带来一些意想不到的错误,虽然这种方法不常见,但还是需要注意这类陷阱。 static void Main() { American american = new American(); ... 阅读全文
posted @ 2015-08-20 15:14 JesseLZJ 阅读(309) 评论(0) 推荐(0) 编辑
摘要: 建议94:区别对待override和newoverride和new使类型体系应为继承而呈现出多态性。多态要求子类具有与基类同名的方法,override和new的作用就是:如果子类中的方法前面带有new关键字,则该法被定义为独立于基类的方法。如果子类中的方法前面带有override关键字,则子类的对象... 阅读全文
posted @ 2015-08-20 14:55 JesseLZJ 阅读(606) 评论(0) 推荐(0) 编辑
摘要: 建议93:构造方法应初始化主要属性和字段类型的属性应该在构造方法调用完毕前完成初始化工作。如果字段没有在初始化器中设置初始值,那么它就应该在构造方法中初始化。类型一旦被实例化,那么它就应该被视为具有完整的行为和属性。 class Company { Employee spe... 阅读全文
posted @ 2015-08-20 14:21 JesseLZJ 阅读(373) 评论(0) 推荐(0) 编辑
摘要: 建议92:谨慎将数组或集合作为属性数组或集合作为属性会引起这样一个问题:如果属性是只读的,我们通常会认为它是不可用改变的,但如果将只读属性应用于数座或集合,而元素的内容和数量却仍旧可以随意改变。如下所示: static void Main(string[] args) {... 阅读全文
posted @ 2015-08-20 14:08 JesseLZJ 阅读(302) 评论(0) 推荐(0) 编辑
摘要: 建议91:可见字段应该重构为属性字段和属性的本质区别就是属性是方法。查看下面这个Person类型: class Person { public string Name { get; set; } }经过编译器编译后,针对属性Name实际会生成一个private字段和两... 阅读全文
posted @ 2015-08-20 13:51 JesseLZJ 阅读(703) 评论(0) 推荐(1) 编辑
摘要: 建议90:不要为抽象类提供公开的构造方法首先,抽象类可以有构造方法。即使没有为抽象类指定构造方法,编译器也会为我们生成一个默认的protected的构造方法。下面是一个标准的最简单的抽象类: abstract class MyAbstractClass { protecte... 阅读全文
posted @ 2015-08-19 23:22 JesseLZJ 阅读(336) 评论(0) 推荐(0) 编辑
摘要: 建议89:在并行方法体中谨慎使用锁除了建议88所提到的场合,要谨慎使用并行的情况还包括:某些本身就需要同步运行的场合,或者需要较长时间锁定共享资源的场合。在对整型数据进行同步操作时,可以使用静态类Interlocked的Add方法,这就极大地避免了由于进行原子操作长时间锁定某个共享资源所带来的同步性... 阅读全文
posted @ 2015-08-19 21:33 JesseLZJ 阅读(330) 评论(0) 推荐(0) 编辑
摘要: 建议88:并行并不总是速度更快并行所带来的后台任务及任务的管理,都会带来一定的开销,如果一项工作本来就能很快完成,或者说循环体很小,那么并行的速度也许会比非并行要慢。看这样一个例子,我们比较在同步和并行状态下的时间消耗:static void Main(string[] args) { ... 阅读全文
posted @ 2015-08-19 21:30 JesseLZJ 阅读(343) 评论(0) 推荐(0) 编辑
摘要: 建议87:区分WPF和WinForm的线程模型WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button、TextBox等)必须由创建它的那个线程进行更新。WinForm在这方面的限制并不是很严格,所以像下面这样的代码,在WinForm中大部分情况下还能运行(本建议后面会详细解释... 阅读全文
posted @ 2015-08-19 21:26 JesseLZJ 阅读(497) 评论(0) 推荐(0) 编辑
摘要: 建议86:Parallel中的异常处理建议85阐述了如何处理Task中的异常。由于Task的Start方法是异步启动的,所以我们需要额外的技术来完成异常处理。Parallel相对来说就要简单很多,因为Parallel的调用者线程会等到所有的任务全部完成后,再继续自己的工作。简单来说,它具有同步的特性... 阅读全文
posted @ 2015-08-19 21:17 JesseLZJ 阅读(1085) 评论(1) 推荐(0) 编辑
摘要: 建议85:Task中的异常处理在任何时候,异常处理都是非常重要的一个环节。多线程与并行编程中尤其是这样。如果不处理这些后台任务中的异常,应用程序将会莫名其妙的退出。处理那些不是主线程(如果是窗体程序,那就是UI主线程)产生的异常,最终的办法都是将其包装到主线程上。在任务并行库中,如果对任务运行Wai... 阅读全文
posted @ 2015-08-19 21:12 JesseLZJ 阅读(611) 评论(0) 推荐(1) 编辑
摘要: 建议84:使用PLINQLINQ最基本的功能就是对集合进行遍历查询,并在此基础上对元素进行操作。仔细推敲会发现,并行编程简直就是专门为这一类应用准备的。因此,微软专门为LINQ拓展了一个类ParallelEnumerable(该类型也在命名空间System.Linq中),它所提供的扩展方法会让LIN... 阅读全文
posted @ 2015-08-19 18:49 JesseLZJ 阅读(445) 评论(0) 推荐(0) 编辑
摘要: 建议83:小心Parallel中的陷阱Parallel的For和ForEach方法还支持一些相对复杂的应用。在这些应用中,它允许我们在每个任务启动时执行一些初始化操作,在每个任务结束后,又执行一些后续工作,同时,还允许我们监视任务的状态。但是,记住上面这句话“允许我们监视任务的状态”是错误的:应该把... 阅读全文
posted @ 2015-08-19 18:37 JesseLZJ 阅读(495) 评论(0) 推荐(0) 编辑
摘要: 建议82:Parallel简化但不等同于Task默认行为建议81说到了Parallel的使用方法,不知道大家是否注意到文中使用的字眼:在同步状态下简化了Task的使用。也就是说,在运行Parallel中的For、ForEach方法时,调用者线程(在示例中就是主线程)是被阻滞的。Parallel虽然将... 阅读全文
posted @ 2015-08-19 17:21 JesseLZJ 阅读(284) 评论(0) 推荐(0) 编辑
上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 14 下一页