话说C#静态方法

看一个小项目代码的时候发现BLL和DAL两层所有的方法都声明为静态方法,第一感觉就是采用这种方式不和谐,但又说不出所以然。查看了MSDN和CLR via C#资料总结如下:

MSDN静态方法可以被重载而不能被重写。静态方法和属性不能访问其包含类型中的非静态字段和事件,并且不能访问任何对象的实例变量(除非在方法参数中显式传递)。对静态方法的调用以 Microsoft 中间语言 (MSIL) 生成调用指令,而对实例方法的调用生成 callvirt 指令,该指令还检查 null 对象引用。但是,两者之间的性能差异在大多数时候并不明显。下图1可以看出实例方法的调用指令。

 

图1

CLR via C#调用一个静态方法时,CLR会定位与定义静态方法的类型对应的类型对象。然后,JIT编译器在类型对象的方法表中查找与被调用的方法对应的记录项,对方法进行JIT编译(如果需要的话),再调用JIT编译的代码。过程图如下:

 话说C#静态方法_第1张图片

图2

 

小结:

一般情况下声明静态方法的类大多是工具类,并且这些静态方法不需要访问类型中的非静态字段和事件,也就是说静态方法与该类型中的非静态字段和事件不具有逻辑上的关联性。

如果一个方法声明为静态方法,也意味着不能被重写,该方法失去面向对象的扩展和多态的特性。

静态方法与实例方法在性能和占用内存上没有明显的区别,是否声明为静态方法需要从类型的非静态字段、事件、面向对象扩展和多态这三方面来考虑。

参考资料:

http://msdn.microsoft.com/zh-cn/library/vstudio/79b3xss3(v=vs.90).aspx

CLR via C# 第三版 P97


你可能感兴趣的:(话说C#静态方法)