属性和字段之间的语义差异及其含义

时间:2011-05-27 16:00:02

标签: c# semantics

private string Property {get; set;}private string field

请注意,都是私有的(因此它们不会在此类之外公开),并且该属性未采用额外验证。

关于语义,它们有不同的含义吗?从某种意义上讲,它们在使用时是否可以互换?

当谈到影响,例如(微?)性能时,如果你创建一个字段而不是一个属性,即让编译器为你处理后备字段,这是否重要。

5 个答案:

答案 0 :(得分:3)

如果他们是私密的,我知道的唯一区别是该属性不适合outref参数。

但大多数私有财产并没有带来任何好处(在一个领域),所以为什么要这么麻烦? 可能存在(微)性能成本。我会更担心额外的混乱。

答案 1 :(得分:3)

  • 属性是关于字段的数据隐藏
  • 私人财产并不意味着什么,因为无论谁有权访问该地产,都可以访问该地区
  • 自动属性与支持字段存在无性能影响,因为编译器会吐出支持字段,但可能存在序列化/反序列化警告

更新

效果影响:

使用属性(自动或支持字段)与字段有轻微的性能,因为属性是一种方法,需要调用CLR virtcall

但正如我所说,使用属性没有多大意义,我相信字段更具可读性,通常可以通过命名约定立即看到(以<开头) em>下划线或骆驼套管)。

答案 2 :(得分:1)

您不能引用属性,但可以获得对成员的引用。因此,如果您使用成员,则可能无法在以后将其切换为属性,例如添加臭名昭着的验证。

答案 3 :(得分:0)

创建私有自动属性没有用,我可以看到。如果它不是自动的,它可以用作某种内部“事件处理程序”来保持对象状态是最新的:每次字段在代码中的任何地方改变(通过setter)时执行一些操作。

性能?我不认为会出现问题,甚至不是微观层面。

答案 4 :(得分:0)

属性是功能 字段是'变量,至少具有类可见性。

因此,如果你有私人财产与私人领域:


与性能点的区别:

如果您使用优化并且没有跟踪(属性被视为内联),则没有区别。

语义上的差异:

1)正式没有区别。
2)更深刻,存在差异。由于属性是函数,因此您可以从getter和setter获取委托。并且可以使用委托作为...委托,就像将此委托与其他委托一起放入列表(Create a delegate from a property getter or setter method

与设计视图的区别:

但属性是看起来像变量的函数。为什么人们需要看起来像变量的函数?

让我们说你有班级的手,这只手有可变的fingersNumber。

 class Hand
 {
     public int fingersNumber;
 }

然后你可能会有很多像

这样的代码
 if(he is BadPerson) leftHand.fingersNumber--
 if(doctor.Heal()) leftHand.fingersNumber++

但是在某些时候你可能想要为Hand添加一些其他变量。让我们说它是ringNumber。而且你知道,每个手指不能超过10个戒指。

 class Hand
 {
     public int fingersNumber;
     public int ringsNumber;

 }

现在,你不能只做

 leftHand.fingersNumber-- 

因为你必须控制fingersNumber依赖的ringNumber。

所以你必须创建一些可以检查这种依赖性的函数。此外,您必须隐藏来自用户的数字和数字,以便他们无法在不进行检查的情况下更改此字段。

 class Hand
 {
     private int fingersNumber;
     private int ringsNumber; 
     public int GetFingersNumber(){...check logic...}
     public void SetFingersNumber(int value){...check logic...}
     public int GetRingsNumber(){...check logic...}
     public void SetRingsNumber(int value){...check logic...}
 }

并将此功能用作

 if(he is BadPerson) leftHand.SetFingersNumber(leftHand.GetFingersNumber()-1)

这里的问题是旧代码leftHand.fingersNumber--现在不起作用。从一开始你就不会知道将来会添加戒指。为了解决这些问题,它成为了将字段设置为私有的范例,并使用Set和Get函数来获取和更改变量,并确保将来可以在那里添加任何逻辑并且代码可以工作!

Setters和Getters是C ++,Java和许多语言的当前情况。 但C#创作者走得更远,将这些getter和setter函数装饰为“属性”。

 class Hand
 {
     private int fingersNumber; 
     public int FingersNumber
     {
          get{return fingersNumber;}
          set{fingersNumber=value;}
     }
     ...     
  }
  ...
  if(he is BadPerson) leftHand.FingersNumber--;

但是大多数时候人们创建这样简单的属性,你看到这个例子,它是5行常规代码。因此,在某些版本的C#autoproperties中添加了以简化程序员的生活。所以你的课可能看起来像

 class Hand
 {
     public int FingersNumber{get;set;}
 }

但您可以随时扩展此设置行为:

  class Hand
 {
     private int fingersNumber; 
     public int FingersNumber
     {
          get{...check logic...}
          set{...check logic...}
     }

     ...     
  }

它不会制定任何代码。喜欢

  if(he is BadPerson) leftHand.FingersNumber--;

那么这些属性是什么,为什么使用它们以及与字段有什么区别。

同样如前所述,如果使用优化,简单属性和autoproperties与变量具有相同的性能。硒拆解或只是谷歌关于它。