随笔分类 - 【读书随笔】《Effective C#》
摘要:实现ICloneable接口,看起来是个不错的选择,想要类型支持拷贝,就实现ICloneable,不想支持拷贝,就不实现ICloneable。但是,大家仔细想一想,你的对象并不是在一个独立的环境中运行,需要考虑到对派生类的影响,基类已经实现了ICloneable接口,派生类也继承了基类的Clone方法,所以派生类最好也支持ICloneable接口,这样所有派生类都应保持一致,所以所有派生类都应实现ICloneable接口,还需要考虑到类的成员都必须支持ICloneable接口或提供一种机制支持拷贝,如果支持深拷贝的对象包含有网状结构的对象,就会使拷贝很成问题。
阅读全文
摘要:当你创建自己的类型时,应该定义类型的顺序关系,以便在集合中描述对象的存储及排序。.net框架为我们定义了两个接口用于实现对象的比较顺序关系,分别是:IComparable和IComparer。IComparable接口用于定义类型的自然顺序(据我理解也就是对象的默认顺序关系),IComparer接口用于定义其他可选的顺序关系。你可以在实现这两个接口时,定义并实现自己的比较操作符(,=,=),这样可以避免.net运行时采用默认比较关系的低效问题。当你实现了这两个接口,.net框架核心可以通过你的接口实现来对类型的对象进行比较和排序,这样在客户端就能获得更高的比较和排序的效率。
阅读全文
摘要:持久性是类型的一个核心属性,这是一个很容易被忽略的基本元素。如果你的类型不支持序列化,那么你就会为使用你的类型作为成员或基类的开发者增加了很多工作量,他们必须在不能访问你的类型私有细节的情况下对你的类型实现序列化,很明显,如果你不在定义类型时将类型声明为可序列化,那么使用你类型的客户端是很难或根本不可能为你的类型添加这个属性的。
阅读全文
摘要:声明式编程通常比命令式编程更能简单,清楚的描述软件的行为。声明式编程意味着你能通过一个简单的声明来定义你的程序的行为,而不是传统的写代码来定义程序的行为(比如在类中通过定义方法来定义软件的行为)。那么在C#中怎么实现声明式编程呢,其实就是通过C#的Attribute来实现的,你可以将Attribute添加到类,方法,属性,字段的定义上面,然后.NET运行时为你产生具体的行为(即该声明所对应的代码)。由此看来,声明式编程更加容易实现,可读性更强,并且减少了出错机会(毕竟那部分代码是由.NET运行时为你产生的)。
阅读全文
摘要: 本来今天应该写到item21 Define Outgoing interfaces with events,但是因为对其中的类型中用事件集合来解决一个类型中包含多个事件的情况,并在运行时创建需要的事件对象的机制还不是很明白(大家可以去读原文,或去了解一下System.Windows.Forms.Control的事件机制,如果园子里的高手能指点一二,就感激不尽),所以只能先写一下item23(避免返回内部对象的引用) 的读书笔记了,呵呵,实在能力有限,请原谅。
阅读全文
摘要:从该条目的标题的字面来理解,就是“通过委托表示回调”。那么什么是回调呢,作者在书中给了一个解释:回调是用来提供从服务器到客户端的异步信息反馈。
我的理解是客户端向服务器端提出一个请求,然后服务器端开始执行该请求,而客户端继续做自己的工作。当服务器端执行完请求时,或发生一些状态改变时,就可
以向客户端反馈信息。在c#中是通过委托来实现回调的,委托是一个包含对方法引用的对象,该方法可以是静态的,也可以是实例方法。
阅读全文
摘要: 学了一年多的c#,看了不少书,但是由于实践机会不多,忘的比学的快。迷茫了好一阵,听工作室的前辈说写博客是个不错的巩固知识的方式,于是想试一试,最近正在读《Effective C#》,所以想从读书笔记开始。
今天刚看到第20条,如何区分实现接口方法和覆写虚方法。
乍看之下,实现接口方法和覆写虚方法非常相似,都是在本类型中为在其他类型中声明的方法提供本类型的实现。但实际上是有本质不同的,至少,接口中的方法默认情况下是非虚的,也就是说子类不能覆写在基类中实现的接口虚方法。
阅读全文

浙公网安备 33010602011771号