我对 C# 还很陌生,我认为属性是一件很棒的事情。事实上,这太棒了,以至于我看不出使用字段有任何真正的优势。即使对于私人领域,属性提供的灵活性和模块化似乎充其量可以让您避免严重的头痛,而最坏的情况则根本没有任何效果。
我看到的字段的唯一优点是您可以内联初始化它们。但大多数时候,无论如何,您都希望在构造函数中初始化它们。如果您不使用内联初始化,是否有任何理由不始终使用属性?
编辑:有些人提出需要使用字段备份属性(显式或自动)。让我们澄清我的问题:是否有任何理由使用字段除了备份属性?即,是否有任何时间SomeType someField;
优于SomeType SomeProperty { get; set; }
?
编辑 2:DanM、Skurmedel 和 Seth 都给出了非常有用的答案。我已经接受了 DanM 的,因为它是最完整的,但如果有人将他们的回答总结为一个答案,我很乐意接受。
通常,属性需要一个支持字段,除非它们是简单的 getter/setter“自动属性”。
所以,如果你只是做...
public string Name { get; set; } // automatic property
...你不需要一个字段,我同意,没有理由拥有一个字段。
然而,如果你正在做...
public string Name
{
get { return _name; }
set
{
if (value = _name) return;
_name = value;
OnPropertyChange("Name");
}
}
...你需要那个_name
支持场。
对于不需要任何特殊获取/设置逻辑的私有变量,实际上是一个判断调用,是执行私有自动属性还是仅执行字段。我通常会做一个字段,然后,如果我需要的话protected
or public
,我将其更改为自动属性。
Update
正如 Yassir 所指出的,如果您使用自动属性,幕后仍然潜伏着一个字段,它只是您实际上不需要输入的内容。因此,底线是:属性不存储数据,它们提供对数据的访问。字段是实际保存数据的内容。因此,即使您看不到它们,您也需要它们。
Update 2
关于您修改后的问题...
是否有任何时候 SomeType someField;优于SomeType SomeProperty { get; set; }
?
...想到一件事:如果您有一个私有字段,并且(根据私有字段的约定)您称其为_name
,这向您和任何阅读您代码的人发出信号,表明您正在直接使用私有数据。另一方面,如果您将所有东西都设为财产,并且(根据财产约定)称为您的私有财产Name
,现在你不能只看变量就知道它是私有数据。因此,仅使用属性会剥夺一些信息。我还没有尝试使用所有属性来判断这是否是关键信息,但肯定会丢失一些东西。
另一件事,更次要的是,public string Name { get; set; }
需要更多的打字(并且有点混乱)private string _name
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)