取private string Property {get; set;}
与private string field
。
请注意,都是私有的(因此它们不会在此类之外公开),并且该属性未采用额外验证。
关于语义,它们有不同的含义吗?从某种意义上讲,它们在使用时是否可以互换?
当谈到影响,例如(微?)性能时,如果你创建一个字段而不是一个属性,即让编译器为你处理后备字段,这是否重要。
答案 0 :(得分:3)
如果他们是私密的,我知道的唯一区别是该属性不适合out
和ref
参数。
但大多数私有财产并没有带来任何好处(在一个领域),所以为什么要这么麻烦? 可能存在(微)性能成本。我会更担心额外的混乱。
答案 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与变量具有相同的性能。硒拆解或只是谷歌关于它。