如何解决属性和字段之间的语义差异及其含义
| 取private string Property {get; set;}
和private string field
。
请注意,两者都是私有的(因此它们不会在此类之外公开),并且该属性未使用额外的验证。
至于语义,它们有不同的含义吗?从某种意义上说,当像这样使用时它们可以互换吗?
当涉及到诸如(micro?)性能之类的含义时,是否创建字段而不是属性无关紧要,即让编译器为您处理后备字段。
解决方法
当它们是私有的时,我知道的唯一区别是该属性不适用于
out
和ref
参数。
但是,大多数情况下,私有财产并没有带来任何优势(相对于田间而言),那为什么还要麻烦呢?
可能会有(微)性能成本。我会担心额外的混乱。
,
属性是关于字段的数据隐藏
私有财产意义不大,因为有权访问该财产的人也将有权访问该字段
对于自动属性与后备字段没有性能影响,因为编译器吐出了后备字段,但是可能会有序列化/反序列化警告。
更新
性能影响:
使用属性(自动或有后备字段)与字段相比,性能稍有下降,因为属性是一种方法,需要调用CLR 4。
但是正如我所说,使用属性没有太多意义,而且我相信字段的可读性更高,通常可以通过命名约定立即看到(以下划线或驼峰开头)。
, 您无法引用属性,但是可以引用成员。因此,如果使用成员,则以后无论出于何种原因(例如添加臭名昭著的验证),都可能无法将它们切换到属性。
, 创建私有自动属性没有用,我可以看到。如果不是自动的,则可以将其用作某种内部“事件处理程序”以使对象状态保持最新:每次字段更改时(通过setter)在代码中的任何位置执行一些操作。
性能?我认为即使在微观层面上也不会存在问题。
,属性是功能。
字段是“至少具有类别可见性的变量”。
因此,如果您拥有私有财产与私有领域:
与性能点的区别:
如果您使用优化并且没有跟踪,则没有区别(属性被视为内联)。
语义上的差异:
1)正式没有区别。
2)更深入地讲,存在区别。由于属性是函数,因此您可以从getter和setter获取委托。并且可以将委托用作...委托,就像将此委托与其他委托放到列表中一样(通过属性getter或setter方法创建委托)
从设计角度看的区别:
但是属性是看起来像变量的函数。为什么可能需要看起来像变量的函数?
假设您有Hand类,并且此手具有可变的FingersNumber。
class Hand
{
public int fingersNumber;
}
那么您可能会有很多类似的代码
if(he is BadPerson) leftHand.fingersNumber--
if(doctor.Heal()) leftHand.fingersNumber++
但是在某些时候,您可能需要向Hand添加一些其他变量。可以说它是ringsNumber。而且您知道,每个手指的指环不能超过10个。
class Hand
{
public int fingersNumber;
public int ringsNumber;
}
现在,你不能只是做
leftHand.fingersNumber--
因为您必须控制fingerNumber依赖项上的ringsNumber。
因此,您必须创建一些函数来检查这种依赖性。另外,您还必须向用户隐藏fingerNumber和eringNumber,以便他们不进行检查就无法更改此字段。
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函数来获取和更改变量成为一种范例,并确保将来可以在其中添加任何逻辑并且代码可以工作!
Setter和Getters是C ++,Java和许多语言的最新情况。
但是C#创建者走得更远,并装饰了诸如“属性”之类的吸气器和设置器功能。
class Hand
{
private int fingersNumber;
public int FingersNumber
{
get{return fingersNumber;}
set{fingersNumber=value;}
}
...
}
...
if(he is BadPerson) leftHand.FingersNumber--;
但是大多数情况下,人们会创建这种简单的属性,而您看到的示例是5行例程代码。因此,在某些版本的C#中,添加了自动属性以简化程序员的工作。所以您的课程可能看起来像
class Hand
{
public int FingersNumber{get;set;}
}
但您随时可以扩展此get set行为:
class Hand
{
private int fingersNumber;
public int FingersNumber
{
get{...check logic...}
set{...check logic...}
}
...
}
而且它不会违反任何代码。喜欢
if(he is BadPerson) leftHand.FingersNumber--;
多数民众赞成在什么是属性,为什么要使用它们以及与字段有什么区别。
同样,正如我之前所说,如果使用优化,则简单属性和自动属性的性能与变量相同。 Se反汇编或只是谷歌关于它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。