C# private字段和public属性

开发 后端
这里介绍C# private字段和C# public属性,自己写了一个小工具,来提供一个类的字段名和类型,然后自动为该类生成相应的C# private字段和C# public属性。

本文向大家介绍C# private字段和C# public属性,可能好多人还不知道C#语言,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西。

学习研究.NET的早期,经常碰到一些学习C#.NET的朋友问,要属性这种华而不实的东西做什么?后来做项目时也时常接到team里的人的抱怨反馈,为什么不直接放一个public字段?如:

  1. class Card  
  2. {  
  3. public string Name;  
  4. }  
  5. 而要做一个private字段+public属性  
  6. class Card  
  7. {  
  8. private string name;  
  9. public string Name  
  10. {  
  11. get { return this.name;}  
  12. set { this.name=value;}  
  13. }  

我记得在早期的一个项目里,team中的一个朋友甚至厌烦了写C# private字段和C# public属性,尤其是碰到一大堆臃肿的data object class的时候,索性自己写了一个小工具,来提供一个类的字段名和类型,然后自动为该类生成相应的C# private字段和C# public属性。

我在编程的时候是个彻底的实用主义者,用稍微高雅一点的话说叫“不喜欢过度的设计”。如果真的像上面那样写Card,而且在将来没有什么改变的需求,我也不喜欢像上面第2段程序那样把事情故意搞得复杂。但如果从component的角度来讲,总有一些class是要供外部长久地使用,也潜在地在将来有被改变的需求。这时候,提供属性就很有必要了。

这就是这个Item试图要归纳的使用属性的理由:
1.可以对赋值做校验、或者额外的处理
2.可以做线程同步
3.可以使用虚属性、或者抽象属性
4.可以将属性置于interface中
5.可以提供get-only或者set-only版本,甚至可以给读、写以不同的访问权限(C# 2.0支持)

个人感觉3、4条是属性最大的优点,可以填补没有“虚字段”或“抽象字段”的缺憾,在设计组件的时候非常有用,也体现了C#这样的component-oriented语言的精神内涵。

但如果没有上述理由,而且日后对程序做大的改动可能性比较小时,我想也大可不必非要把每个 public字段都要变成属性。比如在设计一些轻型的struct,用于互操作的时候,直接使用public字段没什么不好。所以,感觉本条目Bill Wagner先生使用“Always Use Properties Instead of Accessible Data Members”显得太过强硬。

其实,这里的讨论也表明阅读《Effective C#》一书时需要注意的地方,即Effective原则并不是放之四海而皆准的。不同的项目(组件化、复用程度较高的项目?还是“一次编写、N年都 run”的项目),不同的角色(类库/组件开发人员?还是应用程序开发人员?),有着不同的Effective准则。事实上,书中很多Items都是从类库/组件开发人员的角度来考虑的。

关于属性的性能问题需要谈一点,如果仅仅是简单地以存取模式来使用属性,在相当程度上是没有性能损失的。因为在JIT编译过程中已经做了inline的处理。不过inline处理还是有一些基本的条件,有些情况下JIT编译器不会inline,比如虚调用,方法的IL代码长度过长(目前CLR的规定是超过32bytes为代码长度过长),有复杂的控制流逻辑,有异常处理等。这些条件都是要么根本不能使用inline(比如虚属性),要么inline的代价太大,容易导致代码的bloat,要么是inline起来很费时间——已经丧失了 inline的意义,因为.NET的inline机制发生在JIT过程中。使用属性有个别让人感觉不舒服的地方,比如它影响开发人员的开发效率,但对代码运行的效率不产生影响。

【编辑推荐】

  1. C#窗体里调用浅谈
  2. C#调用ListEmployee命令
  3. C# CreateEmployeeDefinition()函数
  4. C#实现断点续传详细剖析
  5. C# Employee对象浅谈
责任编辑:佚名 来源: 博客园
相关推荐

2009-09-17 16:45:56

C#数组

2009-09-01 17:41:45

C# HelpAttr

2009-06-17 10:05:07

自动实现属性VBC#

2009-08-21 15:57:58

C# DataSour

2009-08-26 16:46:06

C# ThreadSt

2009-08-27 16:00:03

C#静态字段C#实例字段

2009-08-28 09:30:48

C#命名属性

2009-08-27 10:01:52

C#自动属性

2009-09-03 16:51:27

C#类属性

2009-09-17 17:13:54

C#数组

2009-09-07 15:49:55

C#属性化的方法

2009-08-13 17:04:09

C#语言C#程序

2009-08-27 16:11:03

C# delegateC# event

2009-09-07 04:56:52

C#模式窗体

2009-09-11 12:50:34

Scope属性

2009-08-26 10:34:15

C#类型C#变量

2009-08-24 08:56:55

C#反射

2009-08-24 16:39:19

C# 泛型应用

2009-08-19 16:50:32

Visual C#C#语言特性

2020-02-12 09:00:00

C#编程语言
点赞
收藏

51CTO技术栈公众号