摘要:
有时你需要在你的方法的参数或返回值中使用匿名类型,而编译器不允许你这么使用匿名类型。你可以使用范型方法,或使用System.Object类型做参数来处理这种问题。但有时你又需要一些特定类型的行为特性来完成你的逻辑,而这个特定类型又不完全被你所掌握,这时你就需要使用Dynamic来处理这个问题。 阅读全文
随笔档案-2011年07月
Effective C# 学习笔记(三十九) 使用Dynamic处理范型参数的运行时类型
2011-07-29 19:35 by 小郝(Kaibo Hao), 403 阅读, 收藏,
摘要:
由于Enumerable.Cast方法,其对T类型所知范围仅限于Sytem.Object类型的那些方法,所以对于T类型的特殊类型转换方法(无论是Implicit还是Explicit的)其都不会理睬。所以在使用运行时类型枚举转换时请注意使用适当的方法。 阅读全文
Effective C# 学习笔记(三十八)理解Dynamic的得与失
2011-07-28 22:35 by 小郝(Kaibo Hao), 481 阅读, 收藏,
摘要:
Dynamic是C#4.0新增的特性,其可以使我们完成一些在运行时的动态类型逻辑定义。但是其是一把双刃剑,在带来动态特性以应付多变处理需求的同时,也带来了更多需要校验处理的地方,不能在编译时发现程序的漏洞。而且在运行时由于对类型转换的相关处理,要比静态类型处理逻辑更费资源和时间。 阅读全文
Effective C# 学习笔记(三十七) 警惕并行处理中的异常处理
2011-07-26 23:57 by 小郝(Kaibo Hao), 585 阅读, 收藏,
摘要:
若一个异常到达了调用该线程的方法时,该线程也就终止运行了。而并行编程使用AggregateException类型来处理发生在子线程中的各类异常,而这些异常存储在AggregateException对象的InnerExceptions属性中。处理异常策略的原则是:处理你能恢复到正常状态的异常,抛出其他那些异常。 阅读全文
Effective C# 学习笔记(三十六) 理解PLINQ对IO上瓶颈的处理方式
2011-07-23 21:04 by 小郝(Kaibo Hao), 549 阅读, 收藏,
摘要:
IO操作一般会成为程序性能的瓶颈,我们可以用并行的方式来提高该方面的操作效率。 阅读全文
Effective C# 学习笔记(三十五) 了解PLINQ如何实现并行算法
2011-07-21 22:11 by 小郝(Kaibo Hao), 510 阅读, 收藏,
摘要:
AsParallel() 是PLINQ的一个方法,它使得并行编程变得简单,但是其并不能解决并行编程中的所有问题。本文对利用PLINQ来进行并行编程的内部机制来进行解析。 阅读全文
Effective C# 学习笔记(三十四)避免在子类中重载父类的方法
2011-07-18 12:48 by 小郝(Kaibo Hao), 572 阅读, 收藏,
摘要:
如题,在子类中重载(overload)父类的方法会给你类的客户分不清同样的方法名在运行时到底运行的是哪个类的方法,而且对于C#4.0前后版本的逆变协变支持的不同,你的重载(对于带范型参数的方法)也会有截然相反的结果,所以还是尽量不要再子类中重载父类中的方法。
首先,要分清orverload和override两个单词的中文解释。
overload为重载即表示方法通过参数个数、参数类型的不同对同名方法的另一逻辑实现,等于创建了一个新的同名方法,与原有方法并存。
override为覆写,顾名思义就是覆盖掉父类同名方法,形参列表是与父类一致的。 阅读全文
Effective C# 学习笔记(三十三) 只在更新基类时,使用new关键字
2011-07-18 12:44 by 小郝(Kaibo Hao), 313 阅读, 收藏,
摘要:
对于new关键字在修饰方法的使用我们要小心,因为它并不是像看上去那样会把父类nonVirtual的方法,转为virtual方法。 阅读全文
Effective C# 学习笔记(三十二)避免使用ICloneable接口
2011-07-17 23:34 by 小郝(Kaibo Hao), 347 阅读, 收藏,
摘要:
实现ICloneabl接口听起来很美,不是么?还真不是,你要是为某个类实现了ICloneable接口,你就得为它的子类和相关的深拷贝和浅拷贝担心,注意每一属性的可被复制的深浅及其被复制的必要性。这看起来是多么大的一个工程,也许远远超出你的想象。 阅读全文
Effective C# 学习笔记(三十一)利用IComparable<T>和IComparer<T>接口来实现排序关系
2011-07-17 21:13 by 小郝(Kaibo Hao), 389 阅读, 收藏,
摘要:
你的类型需通过描述在集合中该类型的对象该如何排序和被查找来说明其排序关系。
.NET framework中定义了ICommaprable和IComparer接口来为你的类型定义排序关系。
前者定义了你类型的自然排序方式,后者则定义了其他的排序方式(通过,=等运算关系的定义来提高在运行时的比较性能)。 阅读全文
Effective C# 学习笔记(三十)多用重载少用事件处理器
2011-07-17 21:12 by 小郝(Kaibo Hao), 407 阅读, 收藏,
摘要:
在.net中有两种实现事件机制的方式,一种方式是附加一个事件处理器,另一种是重载基类的虚方法。此两种方式各有其适用的环境。 阅读全文
Effective C# 学习笔记(二十九)在范型中的协变和逆变
2011-07-17 17:34 by 小郝(Kaibo Hao), 509 阅读, 收藏,
摘要:
协变:若一个返回值类型可以用该类型的子类型(继承类型)替代,我们就说该类型是可协变的;
逆变:若一个参数的类型可以用该类型的父类型(被继承类型)替代,我们就说该类型是被逆变的。
在你的范型声明、使用中,注意支持协变(Covariance)和逆变(Contravariance)。编译器会捕捉你使用不当的逆变或协变行为。 阅读全文
Effective C# 学习笔记(二十八)创建基于网络分布式部署的APIs
2011-07-16 22:45 by 小郝(Kaibo Hao), 368 阅读, 收藏,
摘要:
现在越来越多应用采用分布式部署,这种部署方式受限于带宽和并发事务。对于此类应用你应该提供低频率的事务操作和尽量少数据量交互,也就是尽量少的运用有限的带宽来传输数据。本文举例说明该如何设计你的APIs。 阅读全文
Effective C# 学习笔记(二十七)使你的类型可被序列化
2011-07-16 11:12 by 小郝(Kaibo Hao), 546 阅读, 收藏,
摘要:
.net中提供了类型对象序列化的简便实现方式,类型的持久性是一个类型的核心概念,为了使你的类的消费者在使用你的类型对象作为属性或使用你的类型作为父类时,能够方便的序列化他们创建的新类型,你应该尽可能的使你的类型可被序列化。否则这些可被序列化的特性的实现就要交给你的那些类型的消费者了,可惜他们并不比你更了解你的类型。所以使你的类型可被序列化是你应尽的义务和责任…... 阅读全文
Effective C# 学习笔记(二十六)防止返回类内部的对象引用
2011-07-15 20:02 by 小郝(Kaibo Hao), 436 阅读, 收藏,
摘要:
有些时候,你不希望你的类型的属性因为外部引用而更改状态,对外只保持只读或有限的更改权限,这时有四种方法可以防止类内部对象被外部对象引用而引起更改。
1. 值类型
2. 不可变类型
3. 接口
4. 封装 阅读全文
Effective C# 学习笔记(二十五)以事件机制来实现通知
2011-07-15 19:35 by 小郝(Kaibo Hao), 333 阅读, 收藏,
摘要:
事件是用来通知观察者来进行相应的操作,其经常被用来在事件的发送者和接受者间进行解耦,事件的机制也是用观察者模式来实现的。 阅读全文
Effective C# 学习笔记(二十四)运用Delegates来实现回调
2011-07-15 19:33 by 小郝(Kaibo Hao), 375 阅读, 收藏,
摘要:
代理提供了类型安全的回调定义,可以让你在运行时配置你的行为,并且可以通知多个客户端。代理其实是一个指向方法的引用,该方法可以是静态方法也可以是动态实例的。.NET Framework利用 Predicate,Action及Func等类型来定义代理。
但由于历史原因,所有的代理都是多播代理。即所有的代理都是统一顺序执行的,而且若其中一个代理发生了异常,则剩下的代理将无法执行,而且返回值是最后一个添加到代理的方法的返回值。 阅读全文
Effective C# 学习笔记(二十三)理解接口方法和虚方法的区别
2011-07-13 16:14 by 小郝(Kaibo Hao), 427 阅读, 收藏,
摘要:
接口和虚方法的使用的场景各有所指,总的来说实现接口要比重载virtual方法更具有灵活性。你可以sealed、virtual实现的方法或用abstract来定义方法契约,甚至可以在实现接口的方法中调用virtual方法来获取子类对父类方法重载的多态控制,和父类对自己实现的统一控制。父类的虚方法可以提供所有子类对该方法的默认实现,而接口提供了多种方法定义组合(因为可以被多继承),对外提供了更加灵活的暴露契约的方式。 阅读全文
Effective C# 学习笔记(二十二)多用接口定义实现,少用继承
2011-07-13 16:08 by 小郝(Kaibo Hao), 324 阅读, 收藏,
摘要:
首先从宏观上区分接口和类型
1. 接口定义了行为
2. 类型定义特性及继承结构,即是实体间的关系
接口和抽象类的区分
1. 接口和抽象类都可定义行为而不实现 ,但抽象类可以实现也可不实现
2. 接口可以被多继承(实现),抽象类只可被继承一个 阅读全文
Effective C# 学习笔记(二十一)为类型定义有限的职责
2011-07-13 16:04 by 小郝(Kaibo Hao), 266 阅读, 收藏,
摘要:
将类型或类型的方法对外暴露得越少,你将会获得更多的可扩展性,更容易修改其实现,将会减少更多的单元测试。 阅读全文
Effective C# 学习笔记(二十)不可变的原子值类型的好处
2011-07-13 16:03 by 小郝(Kaibo Hao), 520 阅读, 收藏,
摘要:
不变的原子值类型指的是那些其每一个属性可能因任何一个属性的改变而需改变,每个属性都不能独立更新的类型。这种类型的实现方式有许多要注意的地方,主要目的是防止在赋值时出现非法临时状态,可以使用构造函数赋值和Copy创建可变类型属性的方法来保证其数据的合法性。 阅读全文
Effective C# 学习笔记(十九)确保0(null)对于值(引用)类型是一个合法(理)的默认值
2011-07-09 23:23 by 小郝(Kaibo Hao), 290 阅读, 收藏,
摘要:
确保你的类创建对象时的默认值是合法且合理是非常重要的,不论对于值类型还是引用类型都是如此。 阅读全文
Effective C# 学习笔记(十八)区分值类型和引用类型
2011-07-09 23:21 by 小郝(Kaibo Hao), 314 阅读, 收藏,
摘要:
你能分清值类型和引用类型的使用场景么? 阅读全文
Effective C# 学习笔记(十七)标准析构模式的实现
2011-07-08 22:13 by 小郝(Kaibo Hao), 431 阅读, 收藏,
摘要:
标准的析构模式的实现要点如下:
1. 每个使用非托管资源的类都应实现IDisposable接口
2. 每个使用非托管资源的类都应实现finalizer
3. 对于子类的析构,需重载其父类的Dispose方法,并在其方法中析构自己的托管和非托管对象,并且不要忘记调用父类的析构方法。
4. 不要在析构方法里添加与析构无关的代码,否则会引起严重的问题 阅读全文
Effective C# 学习笔记(十六)尽量少的创建对象,给GC减减负
2011-07-08 22:12 by 小郝(Kaibo Hao), 405 阅读, 收藏,
摘要:
频繁的使用GC回收大量垃圾会使你的程序变得很慢,这时你要优化你的设计,构建复用的对象和在使用时才初始化的方法可以帮助你为GC减负。 阅读全文
Effective C# 学习笔记(十五)使用Using和Try/Finally 进行资源清理
2011-07-08 22:03 by 小郝(Kaibo Hao), 424 阅读, 收藏,
摘要:
使用Using和Try/Finally语法来管理你的非托管资源,请注意二者的使用场景... 阅读全文
Effective C# 学习笔记(十四) 尽量减少重复性的初始化逻辑
2011-07-05 22:55 by 小郝(Kaibo Hao), 317 阅读, 收藏,
摘要:
由于运行效率和代码可维护性问题,应尽量避免使用构造函数的复合调用,C#4.0可以使用参数默认值语法解决,之前的版本用this或base调用构造函数重载 阅读全文
Effective C# 学习笔记(十三)对静态类成员使用合适的初始化方式
2011-07-05 22:52 by 小郝(Kaibo Hao), 417 阅读, 收藏,
摘要:
静态成员变量的构造会引起某些麻烦,若其初始化失败会引起CLR终止你的应用程序,所以最好在静态构造函数中用异常处理机制保证其正确初始化,即使出错也有处理方法 阅读全文
Effective C# 学习笔记(十二) 多用成员变量初始化,少用指定赋值
2011-07-05 22:49 by 小郝(Kaibo Hao), 518 阅读, 收藏,
摘要:
由于构造函数可以重载,对于成员变量的初始化最好还是在声明时赋值,以免重载后忘记赋值,而成员变量的赋值会在构造函数执行前执行 阅读全文
Effective C# 学习笔记(基础篇).NET 资源管理基础
2011-07-04 23:05 by 小郝(Kaibo Hao), 338 阅读, 收藏,
摘要:
.net 框架中的GC回收机制是这样的,首先GC会通过一个应用对象树形结构来管理所有被应用引用的对象,对于没有被应用引用的对象将被垃圾回收,而其垃圾回收对象的顺序是没有被控制的。GC跑在自己的线程上,其每次运行都会整理堆空间,使未使用的堆空间变得连续。基于以上机制,对于Finalizers析构来说,其析构执行的时间也是不确定的,所以尽量不要在托管代码中使用Finalize处理析构事宜,但可以析构非托管对象。Generation标记由上一垃圾回收后产生的新对象其 Generation 值为0 (收集初始值:256K)由上一垃圾回收后第一次存活下来的对象其Generation的值为1 (收集初始值 阅读全文
Effective C# 学习笔记(十一)尽量缩减函数体的大小,提高运行效率
2011-07-04 20:32 by 小郝(Kaibo Hao), 400 阅读, 收藏,
摘要:
给你的方法函数瘦身吧,这样才能跑得更快 :) 阅读全文
Effective C# 学习笔记(十) 用可选参数尽量减少方法重载
2011-07-04 20:30 by 小郝(Kaibo Hao), 500 阅读, 收藏,
摘要:
C# 引入了可选参数和命名参数的语法以简化函数的声明和使用,但使用上有些细节还是要注意的... 阅读全文
Effective C# 学习笔记(九) 在你的API中避免使用类型转换运算
2011-07-04 20:25 by 小郝(Kaibo Hao), 367 阅读, 收藏,
摘要:
类型转换会影响使你的程序得到意想不到的结果,你要谨慎使用呦 阅读全文
Effective C# 学习笔记(八)多用query语法,少用循环
2011-07-03 22:55 by 小郝(Kaibo Hao), 854 阅读, 收藏,
摘要:
比较后发现 query syntax确实太有优势了,少用循环吧 :) 阅读全文
Effective C# 学习笔记(七) 重载GetHashCode()方法要小心
2011-07-03 22:52 by 小郝(Kaibo Hao), 713 阅读, 收藏,
摘要:
GetHashCode()方法你重载过么?重载的原则是什么? 阅读全文
Effective C# 学习笔记(六)理解各种“等运算”操作
2011-07-03 22:50 by 小郝(Kaibo Hao), 467 阅读, 收藏,
摘要:
关于C#中的“等运算”你了解多少,何时该重载你的类的Equals方法? 阅读全文
Effective C# 学习笔记(五) 最好重载你所创建类的ToString()方法
2011-07-02 23:15 by 小郝(Kaibo Hao), 439 阅读, 收藏,
摘要:
人人为我,我为人人,大家都来重载ToString()方法吧 阅读全文
Effective C# 学习笔记(四)使用Conditional Attributes 替代 #if
2011-07-02 23:14 by 小郝(Kaibo Hao), 511 阅读, 收藏,
摘要:
关于 Conditional Attributes 你了解多少? #if 是否该退休了? 阅读全文
Effective C# 学习笔记(三)在类型转换上多使用 as 和 is
2011-07-02 23:12 by 小郝(Kaibo Hao), 521 阅读, 收藏,
摘要:
cast/as/is你能分清他们的用法么?在什么情况下有限制?何种场景下用? 阅读全文
Effective C# 学习笔记(二)readonly和const的性能和灵活性的权衡
2011-07-02 23:10 by 小郝(Kaibo Hao), 678 阅读, 收藏,
摘要:
你分得清 const 和 staitc readonly 声明的使用场景么?看看这篇文章会有启发的 :) 阅读全文
Effective C# 学习笔记(一) 用属性替代公有变量
2011-07-02 23:07 by 小郝(Kaibo Hao), 1178 阅读, 收藏,
摘要:
大家都在说要用 属性 替代 公有变量的声明,但在实践中,很多人说的多做得少,究其原因估计还是不了解其好处何在,看了这篇文章后,应该会有些启发 阅读全文
浙公网安备 33010602011771号