上一页 1 ··· 7 8 9 10 11 12 13 14 下一页
摘要: 建议41:实现标准的事件模型上一建议中,我们实现了一个带事件通知的文件传输类FileUploader。虽然已经满足需求,但却不符合C#的编码规范,查看EventHandler的原型声明:public delegate void EventHandler(object sender, EventArg... 阅读全文
posted @ 2015-08-15 20:36 JesseLZJ 阅读(392) 评论(0) 推荐(1) 编辑
摘要: 建议40:使用event关键字为委托施加保护在建议中我们实现了一个具有通知功能的文件传输类,如下: class FileUploader { public delegate void FileUploadedHandler(int progress); pub... 阅读全文
posted @ 2015-08-15 20:14 JesseLZJ 阅读(334) 评论(0) 推荐(0) 编辑
摘要: 建议39:了解委托的实质理解C#中的委托需要把握两个要点:1)委托是方法指针。2)委托是一个类,当对其进行实例化的时候,要将引用方法作为它的构造方法的参数。设想这样一个场景:在点对点文件传输过程当中,我们要设计一个文件传输类,该传输类起码要满足下面几项功能:传输问题件;按照百分制通知传输进度;传输类... 阅读全文
posted @ 2015-08-15 18:47 JesseLZJ 阅读(518) 评论(0) 推荐(0) 编辑
摘要: 建议38:小心闭包中的陷阱先看一下下面的代码,设想一下输出的是什么? static void Main(string[] args) { List lists = new List(); for (int i = 0; i ... 阅读全文
posted @ 2015-08-15 18:06 JesseLZJ 阅读(458) 评论(0) 推荐(0) 编辑
摘要: 建议37:使用Lambda表达式代替方法和匿名方法在建议36中,我们创建了这样一个实例程序: static void Main(string[] args) { Func add = Add; Action print = Pr... 阅读全文
posted @ 2015-08-15 17:19 JesseLZJ 阅读(535) 评论(0) 推荐(0) 编辑
摘要: 建议36:使用FCL中的委托声明FCL中存在3类这样的委托声明,它们分别是:Action、Func、Predicate。尤其是在它们的泛型版本出来以后,已经能够满足我们在实际编码过程中的大部分需求。Action表示接受0个或多个输入参数,执行一段代码,没有任何返回值;Func表示接受0个或多个输入参... 阅读全文
posted @ 2015-08-15 16:07 JesseLZJ 阅读(431) 评论(0) 推荐(0) 编辑
摘要: 建议35:使用default为泛型类型变量指定初始值有些算法,比如泛型集合List的Find算法,所查找的对象可能会是值类型,也有可能是引用类型。在这种算法内部,我们常常会为这些值类型或引用类型变量指定默认值。于是,问题来了:值类型变量的默认初始值是0值,而引用类型变量的默认初始值是null值,显然... 阅读全文
posted @ 2015-08-15 15:34 JesseLZJ 阅读(368) 评论(0) 推荐(0) 编辑
摘要: 建议34:为泛型参数设定约束“约束”这个词可能会引起歧义,有些人肯能认为对泛型参数设定约束是限制参数的使用,实际情况正好相反。没有“约束”的泛型参数作用很有限,倒是“约束”让泛型参数具有了更多的行为和属性。查看下面代码,我们会发现参数t1或参数t2仅仅具有object的属性和行为,所以几乎不能再方法... 阅读全文
posted @ 2015-08-15 12:11 JesseLZJ 阅读(416) 评论(0) 推荐(0) 编辑
摘要: 建议33:避免在泛型类型中声明静态成员在上一建议中,已经理解了应该将MyList和MyList视作两个完全不同的类型,所以,不应该将MyList中的静态成员理解成MyList和MyList共有的成员。 class MyList { public static int Cou... 阅读全文
posted @ 2015-08-15 11:25 JesseLZJ 阅读(370) 评论(0) 推荐(0) 编辑
摘要: 建议32:总是优先考虑泛型泛型的优点是多方面的,无论泛型类还是泛型方法都同时具备可重用性、类型安全性和高效率等特性,这是非泛型和非泛型方法无法具备的。以可重用性为例: class MyList { private int[] items; public int... 阅读全文
posted @ 2015-08-15 10:51 JesseLZJ 阅读(449) 评论(0) 推荐(0) 编辑
摘要: 建议31:在LINQ查询中避免不必要的迭代无论是SQL查询还是LINQ查询,搜索到结果立刻返回总比搜索完所有的结果再将结果返回的效率要高。示例代码: class MyList : IEnumerable { //为了演示需要,模拟了一个元素集合 List li... 阅读全文
posted @ 2015-08-15 00:54 JesseLZJ 阅读(487) 评论(0) 推荐(0) 编辑
摘要: 建议30:使用LINQ取代集合中的比较器和迭代器LINQ提供了类似于SQL的语法来实现遍历、筛选与投影集合的功能。 static void Main(string[] args) { List companySalary = new List() ... 阅读全文
posted @ 2015-08-15 00:25 JesseLZJ 阅读(481) 评论(0) 推荐(0) 编辑
摘要: 建议29:区别LINQ查询中的IEnumerable和IQueryableLINQ查询一共提供了两类扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了IEnumerable接口的集合进行扩展;Queryable类,它针对继承了IQueryable接口的集... 阅读全文
posted @ 2015-08-14 23:57 JesseLZJ 阅读(381) 评论(0) 推荐(0) 编辑
摘要: 建议28:理解延迟求值和主动求值之间的区别要理解延迟求值(lazy evaluation)和主动求值(eager evaluation),先看个例子: List list = new List() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; ... 阅读全文
posted @ 2015-08-14 23:23 JesseLZJ 阅读(404) 评论(0) 推荐(0) 编辑
摘要: 建议27:在查询中使用Lambda表达式LINQ实际上是基于扩展方法和Lambda表达式的。任何LINQ查询都能通过扩展方法的方式来代替。var personWithCompanyList = from person in personList ... 阅读全文
posted @ 2015-08-14 22:43 JesseLZJ 阅读(365) 评论(0) 推荐(0) 编辑
摘要: 建议26:使用匿名类型存储LINQ查询结果从.NET3.0开始,C#开始支持一个新特性:匿名类型。匿名类型有var、赋值运算符和一个非空初始值(或以new开头的初始化项)组成。匿名类型有如下基本特性:即支持简单类型也指出复杂类型。简单类型必须是一个非空初始值,复杂类型则是一个以new开头的初始化项。... 阅读全文
posted @ 2015-08-14 22:21 JesseLZJ 阅读(416) 评论(0) 推荐(0) 编辑
摘要: 建议25:谨慎集合属性的可写操作如果类型的属性中有集合属性,那么应该保证属性对象是由类型本身产生的。如果将属性设置为可写,则会增加抛出异常的几率。一般情况下,如果集合属性没有值,则它返回的Count等于0,而不是集合属性的值为null。下面的代码将产生一个NullReferenceException... 阅读全文
posted @ 2015-08-14 21:33 JesseLZJ 阅读(377) 评论(0) 推荐(0) 编辑
摘要: 建议24:迭代器应该是只读的如果注意观察会发现,FCL中的迭代器只有GetEnumerator方法,没有SetEnumerator方法,所有的集合类也没有一个可以写的迭代器属性。原因有二:一:这违背了设计模式的开闭原则。被设置到集合中的迭代器可能会直接导致集合的行为发生异常或变动。一旦确实需要新的迭... 阅读全文
posted @ 2015-08-14 19:12 JesseLZJ 阅读(345) 评论(0) 推荐(0) 编辑
摘要: 建议23:避免将List作为自定义集合类的基类如果要实现一个自定义的集合类,不应该以一个FCL集合类为基类,反而应扩展相应的泛型接口。FCL结合类应该以组合的形式包含至自定义的集合类,需要扩展的泛型接口通常是IEnumerable和ICollection(或ICollection的子接口,如ILis... 阅读全文
posted @ 2015-08-14 18:46 JesseLZJ 阅读(628) 评论(0) 推荐(0) 编辑
摘要: 建议22:确保集合的线程安全集合线程安全是指多个线程上添加或删除元素时,线程键必须保持同步。下面代码模拟了一个线程在迭代过程中,另一个线程对元素进行了删除。 class Program { static List list = new List() {... 阅读全文
posted @ 2015-08-14 18:10 JesseLZJ 阅读(644) 评论(0) 推荐(0) 编辑
上一页 1 ··· 7 8 9 10 11 12 13 14 下一页