上一页 1 ··· 6 7 8 9 10 11 12 13 14 下一页
摘要: 建议61:避免在finally内撰写无效代码在阐述建议之前,需要先提出一个问题:是否存在一种打破try-finally执行顺序的情况,答案是:不存在(除非应用程序本身因为某些很少出现的特殊情况在try块中退出)。应该始终认为finally内的代码会在方法return之前执行,哪怕return在try... 阅读全文
posted @ 2015-08-17 19:24 JesseLZJ 阅读(693) 评论(0) 推荐(0) 编辑
摘要: 建议60:重新引发异常时使用Inner Exception当捕获了某个异常,将其包装或重新引发异常的时候,如果其中包含了Inner Exception,则有助于程序员分析内部信息,方便代码调试。以一个分布式系统为例,在进行远程通信的时候,可能会发生的情况肯能会有:1)网卡被禁用或者网线断开,此时会抛... 阅读全文
posted @ 2015-08-17 17:15 JesseLZJ 阅读(452) 评论(0) 推荐(0) 编辑
摘要: 建议59:不要在不恰当的场合下引发异常常见的不易于引发异常的情况是对在可控范围内的输入和输出引发异常。 private void SaveUser3(User user) { if (user.Age 100) { ... 阅读全文
posted @ 2015-08-17 16:35 JesseLZJ 阅读(519) 评论(0) 推荐(0) 编辑
摘要: 建议58:用抛出异常代替返回错误代码CLR异常机制的优点:正常控制流会被立即中止,无效值或状态不会在系统中继续传播。提供了统一的处理错误的方法。提供了在构造函数、操作符重载及属性中报告异常的遍历机制。提供了异常堆栈,便于开发者定位异常发生的位置。不应该将异常机制用于正常控制流中,异常的发生是一个小概... 阅读全文
posted @ 2015-08-17 15:20 JesseLZJ 阅读(626) 评论(0) 推荐(0) 编辑
摘要: 建议57:实现ISerializable的子类型应负责父类的序列化我们将要实现的继承自ISerializable的类型Employee有一个父类Person,假设Person没有实现序列化,而现在子类Employee却需要满足序列化的场景。不过序列化器并没有默认处理Person类型对象,这些事情只能... 阅读全文
posted @ 2015-08-17 02:04 JesseLZJ 阅读(832) 评论(0) 推荐(0) 编辑
摘要: 建议56:使用继承ISerializable接口更灵活地控制序列化过程接口ISerializable的意义在于,如果特性Serializable,以及与其像配套的OnDeserializedAttribute、OnDeserializingAttribute、OnSerializedAttribut... 阅读全文
posted @ 2015-08-17 01:31 JesseLZJ 阅读(447) 评论(0) 推荐(0) 编辑
摘要: 建议55:利用定制特性减少可序列化的字段特性(attribute)可以声明式地为代码中的目标元素添加注释。运行时可以通过查询这些托管块中的元数据信息,达到改变目标元素运行时行为的目的。System.Runtime.Serialization命名空间下,有4个这样的特性:OnDeserializedA... 阅读全文
posted @ 2015-08-17 00:46 JesseLZJ 阅读(520) 评论(0) 推荐(0) 编辑
摘要: 建议54:为无用字段标注不可序列化序列化是指这样一种技术:把对象转变成流。相反过程,我们称为反序列化。在很多场合都需要用到这项技术。把对象保存到本地,在下次运行程序的时候,恢复这个对象。把对象传到网络中的另外一台终端上,然后在此终端还原这个对象。其他场合,如:把对象赋值到系统的粘贴板中,然后用快捷键... 阅读全文
posted @ 2015-08-17 00:07 JesseLZJ 阅读(973) 评论(0) 推荐(0) 编辑
摘要: 建议53:必要时应将不再使用的对象引用赋值为null在CLR托管的应用程序中,存在一个“根”的概念,类型的静态字段、方法参数、以及局部变量都可以作为“根”的存在(值类型不能作为“根”,只有引用类型的指针才能作为“根”)。局部变量在代码运行过程中会在内存中创建一个“根”。在一次垃圾回收中,垃圾回收器会... 阅读全文
posted @ 2015-08-16 23:19 JesseLZJ 阅读(528) 评论(0) 推荐(0) 编辑
摘要: 建议52:及时释放资源垃圾回收机制自动为我们隐式地回收了资源(垃圾回收器会自动调用终结器),那我们为什么要主动释放资源呢?private void buttonOpen_Click(object sender,EventArgs e){ FileStream fileStream = new F... 阅读全文
posted @ 2015-08-16 16:55 JesseLZJ 阅读(597) 评论(0) 推荐(0) 编辑
摘要: 建议51:具有可释放字段的类型或拥有本机资源的类型应该是可释放的在建议50中,我们将C#中的类型分为:普通类型和继承了IDisposable接口的非普通类型。非普通类型除了包含那些托管资源的类型外,本身还包含一个非普通类型的字段。在标准的Dispose模式中,我们对非普通类型举了一个例子:一个非普通... 阅读全文
posted @ 2015-08-16 15:58 JesseLZJ 阅读(601) 评论(0) 推荐(0) 编辑
摘要: 建议50:在Dispose模式中应区别对待托管资源和非托管资源真正资源释放代码的那个虚方法是带一个bool参数的,带这个参数,是因为我们在资源释放时要区别对待托管资源和非托管资源。提供给调用者调用的显式释放资源的无参Dispose方法中,调用参数是true: public void D... 阅读全文
posted @ 2015-08-16 15:42 JesseLZJ 阅读(425) 评论(1) 推荐(0) 编辑
摘要: 建议49:在Dispose模式中应提取一个受保护的虚方法在标准的Dispose模式中,真正的IDisposable接口的Dispose方法并没有做实际的清理工作,它其实是调用了下面的这个带bool参数且受保护的的虚方法: /// /// 非密封类修饰用protected... 阅读全文
posted @ 2015-08-16 15:06 JesseLZJ 阅读(456) 评论(0) 推荐(0) 编辑
摘要: 建议48:Dispose方法应允许被多次调用一个类型的Dispose方法应该允许被多次调用而不抛出异常。鉴于此,类型内部维护了一个私有的bool变量disposed,如下:private bool disposed = false;在实际清理代码的方法中,加入一下判断:if(disposed){ ... 阅读全文
posted @ 2015-08-16 14:28 JesseLZJ 阅读(442) 评论(0) 推荐(0) 编辑
摘要: 建议47:即使提供了显式释放方法,也应该在终结器中提供隐式清理在标准的Dispose模式中,我们注意到一个以~开头的方法,如下: /// /// 必须,防止程序员忘记了显式调用Dispose方法 /// ~SampleClass() ... 阅读全文
posted @ 2015-08-16 13:20 JesseLZJ 阅读(330) 评论(0) 推荐(0) 编辑
摘要: 建议46:显式释放资源需继承接口IDisposableC#中的每一个类型都代表一种资源,资源分为两类:托管资源:由CLR管理分配和释放的资源,即从CLR里new出来的对象。非托管资源:不受CLR管理的对象,如Windows内核对象,或者文件、数据库连接、套接字、COOM对象等。如果我们的类型使用了非... 阅读全文
posted @ 2015-08-16 12:49 JesseLZJ 阅读(484) 评论(0) 推荐(0) 编辑
摘要: 建议45:为泛型类型参数指定逆变逆变是指方法的参数可以是委托或者泛型接口的参数类型的基类。FCL4.0中支持逆变的常用委托有:FuncPredicate常用委托有:IComparer下面例子演示了泛型类型参数指定逆变所带来的好处: class Program { stati... 阅读全文
posted @ 2015-08-15 22:12 JesseLZJ 阅读(257) 评论(0) 推荐(0) 编辑
摘要: 建议44:理解委托中的协变委托中的泛型变量天然是部分支持协变的。为什么是“部分支持协变”?看下面示例: class Program { public delegate T GetEmployeeHanlder(string name); static void ... 阅读全文
posted @ 2015-08-15 21:51 JesseLZJ 阅读(288) 评论(0) 推荐(0) 编辑
摘要: 建议43:让接口中的泛型参数支持协变除了上一建议中提到的使用泛型参数兼容接口不可变性外,还有一种办法是为接口中的泛型声明加上out关键字来支持协变,如下所示: interface ISalary //使用out关键字 { void Pay(); } ... 阅读全文
posted @ 2015-08-15 21:32 JesseLZJ 阅读(364) 评论(0) 推荐(0) 编辑
摘要: 建议42:使用泛型参数兼容泛型接口的不可变性让返回值类型返回比声明的类型派生程度更大的类型,就是“协变”。如: public Employee GetAEmployee(string name) { Console.WriteLine("我是雇员:"... 阅读全文
posted @ 2015-08-15 21:13 JesseLZJ 阅读(459) 评论(0) 推荐(0) 编辑
上一页 1 ··· 6 7 8 9 10 11 12 13 14 下一页