摘要:你的类型需通过描述在集合中该类型的对象该如何排序和被查找来说明其排序关系。
.NET framework中定义了ICommaprable和IComparer接口来为你的类型定义排序关系。
前者定义了你类型的自然排序方式,后者则定义了其他的排序方式(通过,=等运算关系的定义来提高在运行时的比较性能)。 阅读全文
Effective C# 学习笔记(三十一)利用IComparable<T>和IComparer<T>接口来实现排序关系
2011-07-17 21:13 by 小郝(Kaibo Hao), 381 阅读, 2 推荐, 收藏, 编辑Effective C# 学习笔记(三十)多用重载少用事件处理器
2011-07-17 21:12 by 小郝(Kaibo Hao), 400 阅读, 2 推荐, 收藏, 编辑
摘要:在.net中有两种实现事件机制的方式,一种方式是附加一个事件处理器,另一种是重载基类的虚方法。此两种方式各有其适用的环境。 阅读全文
Effective C# 学习笔记(二十九)在范型中的协变和逆变
2011-07-17 17:34 by 小郝(Kaibo Hao), 490 阅读, 2 推荐, 收藏, 编辑
摘要:协变:若一个返回值类型可以用该类型的子类型(继承类型)替代,我们就说该类型是可协变的;
逆变:若一个参数的类型可以用该类型的父类型(被继承类型)替代,我们就说该类型是被逆变的。
在你的范型声明、使用中,注意支持协变(Covariance)和逆变(Contravariance)。编译器会捕捉你使用不当的逆变或协变行为。 阅读全文
Effective C# 学习笔记(二十八)创建基于网络分布式部署的APIs
2011-07-16 22:45 by 小郝(Kaibo Hao), 359 阅读, 2 推荐, 收藏, 编辑
摘要:现在越来越多应用采用分布式部署,这种部署方式受限于带宽和并发事务。对于此类应用你应该提供低频率的事务操作和尽量少数据量交互,也就是尽量少的运用有限的带宽来传输数据。本文举例说明该如何设计你的APIs。 阅读全文
Effective C# 学习笔记(二十七)使你的类型可被序列化
2011-07-16 11:12 by 小郝(Kaibo Hao), 539 阅读, 2 推荐, 收藏, 编辑
摘要:.net中提供了类型对象序列化的简便实现方式,类型的持久性是一个类型的核心概念,为了使你的类的消费者在使用你的类型对象作为属性或使用你的类型作为父类时,能够方便的序列化他们创建的新类型,你应该尽可能的使你的类型可被序列化。否则这些可被序列化的特性的实现就要交给你的那些类型的消费者了,可惜他们并不比你更了解你的类型。所以使你的类型可被序列化是你应尽的义务和责任…... 阅读全文
Effective C# 学习笔记(二十六)防止返回类内部的对象引用
2011-07-15 20:02 by 小郝(Kaibo Hao), 425 阅读, 1 推荐, 收藏, 编辑
摘要:有些时候,你不希望你的类型的属性因为外部引用而更改状态,对外只保持只读或有限的更改权限,这时有四种方法可以防止类内部对象被外部对象引用而引起更改。
1. 值类型
2. 不可变类型
3. 接口
4. 封装 阅读全文
Effective C# 学习笔记(二十五)以事件机制来实现通知
2011-07-15 19:35 by 小郝(Kaibo Hao), 323 阅读, 2 推荐, 收藏, 编辑
摘要:事件是用来通知观察者来进行相应的操作,其经常被用来在事件的发送者和接受者间进行解耦,事件的机制也是用观察者模式来实现的。 阅读全文
Effective C# 学习笔记(二十四)运用Delegates来实现回调
2011-07-15 19:33 by 小郝(Kaibo Hao), 366 阅读, 2 推荐, 收藏, 编辑
摘要:代理提供了类型安全的回调定义,可以让你在运行时配置你的行为,并且可以通知多个客户端。代理其实是一个指向方法的引用,该方法可以是静态方法也可以是动态实例的。.NET Framework利用 Predicate,Action及Func等类型来定义代理。
但由于历史原因,所有的代理都是多播代理。即所有的代理都是统一顺序执行的,而且若其中一个代理发生了异常,则剩下的代理将无法执行,而且返回值是最后一个添加到代理的方法的返回值。 阅读全文
Effective C# 学习笔记(二十三)理解接口方法和虚方法的区别
2011-07-13 16:14 by 小郝(Kaibo Hao), 404 阅读, 1 推荐, 收藏, 编辑
摘要:接口和虚方法的使用的场景各有所指,总的来说实现接口要比重载virtual方法更具有灵活性。你可以sealed、virtual实现的方法或用abstract来定义方法契约,甚至可以在实现接口的方法中调用virtual方法来获取子类对父类方法重载的多态控制,和父类对自己实现的统一控制。父类的虚方法可以提供所有子类对该方法的默认实现,而接口提供了多种方法定义组合(因为可以被多继承),对外提供了更加灵活的暴露契约的方式。 阅读全文
Effective C# 学习笔记(二十二)多用接口定义实现,少用继承
2011-07-13 16:08 by 小郝(Kaibo Hao), 315 阅读, 2 推荐, 收藏, 编辑
摘要:首先从宏观上区分接口和类型
1. 接口定义了行为
2. 类型定义特性及继承结构,即是实体间的关系
接口和抽象类的区分
1. 接口和抽象类都可定义行为而不实现 ,但抽象类可以实现也可不实现
2. 接口可以被多继承(实现),抽象类只可被继承一个 阅读全文
Effective C# 学习笔记(二十一)为类型定义有限的职责
2011-07-13 16:04 by 小郝(Kaibo Hao), 256 阅读, 2 推荐, 收藏, 编辑
摘要:将类型或类型的方法对外暴露得越少,你将会获得更多的可扩展性,更容易修改其实现,将会减少更多的单元测试。 阅读全文
Effective C# 学习笔记(二十)不可变的原子值类型的好处
2011-07-13 16:03 by 小郝(Kaibo Hao), 513 阅读, 2 推荐, 收藏, 编辑
摘要:不变的原子值类型指的是那些其每一个属性可能因任何一个属性的改变而需改变,每个属性都不能独立更新的类型。这种类型的实现方式有许多要注意的地方,主要目的是防止在赋值时出现非法临时状态,可以使用构造函数赋值和Copy创建可变类型属性的方法来保证其数据的合法性。 阅读全文
Effective C# 学习笔记(十九)确保0(null)对于值(引用)类型是一个合法(理)的默认值
2011-07-09 23:23 by 小郝(Kaibo Hao), 283 阅读, 2 推荐, 收藏, 编辑
摘要:确保你的类创建对象时的默认值是合法且合理是非常重要的,不论对于值类型还是引用类型都是如此。 阅读全文
Effective C# 学习笔记(十八)区分值类型和引用类型
2011-07-09 23:21 by 小郝(Kaibo Hao), 302 阅读, 2 推荐, 收藏, 编辑
摘要:你能分清值类型和引用类型的使用场景么? 阅读全文
Effective C# 学习笔记(十七)标准析构模式的实现
2011-07-08 22:13 by 小郝(Kaibo Hao), 421 阅读, 2 推荐, 收藏, 编辑
摘要:标准的析构模式的实现要点如下:
1. 每个使用非托管资源的类都应实现IDisposable接口
2. 每个使用非托管资源的类都应实现finalizer
3. 对于子类的析构,需重载其父类的Dispose方法,并在其方法中析构自己的托管和非托管对象,并且不要忘记调用父类的析构方法。
4. 不要在析构方法里添加与析构无关的代码,否则会引起严重的问题 阅读全文
Effective C# 学习笔记(十六)尽量少的创建对象,给GC减减负
2011-07-08 22:12 by 小郝(Kaibo Hao), 393 阅读, 1 推荐, 收藏, 编辑
摘要:频繁的使用GC回收大量垃圾会使你的程序变得很慢,这时你要优化你的设计,构建复用的对象和在使用时才初始化的方法可以帮助你为GC减负。 阅读全文
Effective C# 学习笔记(十五)使用Using和Try/Finally 进行资源清理
2011-07-08 22:03 by 小郝(Kaibo Hao), 416 阅读, 1 推荐, 收藏, 编辑
摘要:使用Using和Try/Finally语法来管理你的非托管资源,请注意二者的使用场景... 阅读全文
Effective C# 学习笔记(十四) 尽量减少重复性的初始化逻辑
2011-07-05 22:55 by 小郝(Kaibo Hao), 308 阅读, 2 推荐, 收藏, 编辑
摘要:由于运行效率和代码可维护性问题,应尽量避免使用构造函数的复合调用,C#4.0可以使用参数默认值语法解决,之前的版本用this或base调用构造函数重载 阅读全文
Effective C# 学习笔记(十三)对静态类成员使用合适的初始化方式
2011-07-05 22:52 by 小郝(Kaibo Hao), 409 阅读, 2 推荐, 收藏, 编辑
摘要:静态成员变量的构造会引起某些麻烦,若其初始化失败会引起CLR终止你的应用程序,所以最好在静态构造函数中用异常处理机制保证其正确初始化,即使出错也有处理方法 阅读全文
Effective C# 学习笔记(十二) 多用成员变量初始化,少用指定赋值
2011-07-05 22:49 by 小郝(Kaibo Hao), 509 阅读, 2 推荐, 收藏, 编辑
摘要:由于构造函数可以重载,对于成员变量的初始化最好还是在声明时赋值,以免重载后忘记赋值,而成员变量的赋值会在构造函数执行前执行 阅读全文