编写高质量代码改善C#程序的157个建议——建议100:静态方法和实例方法没有区别
2015-08-20 17:08
786 查看
建议100:静态方法和实例方法没有区别
静态方法在加载时机和内存使用上和实例方法完全一致。在这里,我们先引出一个概念“类型对象”。比如类型Person,我们都知道new Person() 会产生一个对象,这个对象叫做“实例对象”,它在运行时会加载到GC Heap上。而“类型对象”是指代表Person类型本身的那个对象,这个对象在第一次使用类型时被加载到Loader Heap上。类型对象包括其自身的指针、自身的同步索引快、静态字段,以及一个方法表。在这个方法表中,无论是静态方法还是实例方法都会被存储起来,当然,存储的是方法的记录项,方法本身是在调用时由运行时编译的。类型对象和实例对象在内存中的分布如下:
如果一定要说静态方法和实例方法的区别,那它们之间唯一的区别就是,当我们需要使用实例方法的时候,首先应该有实例对象。我们不能绕开实例对象,直接从类型本身去调用实例方法。所以,从设计的角度来说,如果一个方法只跟类型本身有关系,那么它就应该被设计成静态方法,如果跟类型的实例对象有关系,那它就应该被设计成实例方法。
静态方法被不少人误解的地方有:静态方法天然就是同步方法。即使是那些有一定开发经验的程序员,有时候也会犯这种常识性的错误。尽管微软声称FCL中大部分代码都被实现成线程安全了,但并不意味着代码天然就是同步的,要让静态方法线程安全,必须由程序员编写同步代码,而不是让编译器或运行时为我们做这些事情。
要从设计的角度去理解静态方法和实例方法。离开了设计,它们没有区别。
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
静态方法在加载时机和内存使用上和实例方法完全一致。在这里,我们先引出一个概念“类型对象”。比如类型Person,我们都知道new Person() 会产生一个对象,这个对象叫做“实例对象”,它在运行时会加载到GC Heap上。而“类型对象”是指代表Person类型本身的那个对象,这个对象在第一次使用类型时被加载到Loader Heap上。类型对象包括其自身的指针、自身的同步索引快、静态字段,以及一个方法表。在这个方法表中,无论是静态方法还是实例方法都会被存储起来,当然,存储的是方法的记录项,方法本身是在调用时由运行时编译的。类型对象和实例对象在内存中的分布如下:
如果一定要说静态方法和实例方法的区别,那它们之间唯一的区别就是,当我们需要使用实例方法的时候,首先应该有实例对象。我们不能绕开实例对象,直接从类型本身去调用实例方法。所以,从设计的角度来说,如果一个方法只跟类型本身有关系,那么它就应该被设计成静态方法,如果跟类型的实例对象有关系,那它就应该被设计成实例方法。
静态方法被不少人误解的地方有:静态方法天然就是同步方法。即使是那些有一定开发经验的程序员,有时候也会犯这种常识性的错误。尽管微软声称FCL中大部分代码都被实现成线程安全了,但并不意味着代码天然就是同步的,要让静态方法线程安全,必须由程序员编写同步代码,而不是让编译器或运行时为我们做这些事情。
要从设计的角度去理解静态方法和实例方法。离开了设计,它们没有区别。
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
相关文章推荐
- C#实现绑定DataGridView与TextBox之间关联的方法
- C# mvc通用扩展性高的权限管理方法,粒度action
- C#通过反射获取当前工程中所有窗体并打开的方法
- dotTrace快速帮助你定位C#代码的性能瓶颈
- C#窗体中根据两点坐标绘制直线
- c#进制转换(转)
- 问题:C# List;结果:C#中数组、ArrayList和List三者的区别
- c# 使用Codosys.dll(CDO)发送邮件
- 编写高质量代码改善C#程序的157个建议——建议99:重写时不应使用子类参数
- C#中安全的判断两个实例是否不等(不是同一个)
- 编写高质量代码改善C#程序的157个建议——建议98:用params减少重复参数
- C#多任务并行阶段控制—— Threading.Barrier
- 编写高质量代码改善C#程序的157个建议——建议97:优先考虑将基类型或接口作为参数传递
- 编写高质量代码改善C#程序的157个建议——建议96:成员应优先考虑公开基类型或接口
- C# ManualResetEvent 类的用法
- c#多态的简单练习
- 编写高质量代码改善C#程序的157个建议——建议95:避免在构造方法中调用虚成员
- C#模拟PrtScn实现截屏
- C#模拟PrtScn实现截屏
- C# String.Format格式说明