公共字段与自动属性之间的区别

406

我们经常听说保护封装性应该通过为类字段创建getter和setter方法(在C#中为属性),而不是将字段暴露给外部世界。

但是,有很多时候,一个字段只是用来保存值,不需要任何计算就能设置或获取。对于这些情况,我们只需要进行以下操作:

public class Book
{
    private string _title;

    public string Title
    {
          get => _title; 
          set => _title = value;
    }
}

其实,我有一个坦白的话要说,我无法忍受写这么多代码(真的,不是因为编写代码本身,而是因为看着它),所以我采用了公共字段。

后来C# 3.0出现了,我发现它们添加了自动属性:

public class Book
{
    public string Title { get; set; } 
}

哪个更整洁,我很感激它,但实际上,与公共字段相比有什么不同吗?

public class Book
{
    public string Title;
}

可能是在C# .NET 3.5+中属性和字段的区别的重复问题。 - nawfal
1
我倾向于将任何非私有的内容都作为属性处理,因为发现在以后的过程中必须重构一个字段成为属性会带来一些不必要的麻烦。属性,字段和方法。哦,天呐! 指出了过去曾经困扰我的一个不兼容性问题。 - Steven Wexler
4
prop 代码片段能够快速创建属性。只需要输入 prop 然后按 Tab 键即可。 - Tono Nam
14个回答

2
你可以使用字段但不能使用属性(或以前不能...我马上会讲到)的一件事是,字段可以指定为readonly,而属性则不行。因此,字段为您提供了明确的方法来表明您的意图,即变量仅在对象实例化时从构造函数中设置,并且之后不应更改。是的,您可以将属性设置为具有私有setter,但那只是表示“不得从类外部更改”,这与“不得在实例化后更改”不同-您仍然可以在类内部更改它。是的,您可以将属性的支持字段设置为只读,但这会将尝试在实例化后更改它移动到运行时错误而不是编译时错误。因此,只读字段可以执行属性无法执行的有用操作。

但是,在C# 9中,我们获得了这个有用的属性语法:

public string Height { get; init; }

这段话意思是“这个属性可以在类的外部使用,但只能在对象初始化时设置”,此时字段的只读优势消失了。


1

如果您稍后决定通过与集合或数据库进行比较来检查标题是否唯一,您可以在不更改依赖于其的任何代码的情况下在属性中执行该操作。

如果您只使用公共属性,则将具有更少的灵活性。

我认为使用属性最重要的是能够在不违反协议的情况下获得额外的灵活性,直到我实际需要这种灵活性,自动生成才是最合理的选择。


0

有一件事情我发现非常有用,不仅是因为代码和测试的原因,而且如果它是一个属性而不是一个字段,Visual Studio IDE会显示属性的引用,但不会显示字段的引用。


0

经过一些研究后,我的观点是:

  1. 验证。
  2. 允许重写访问器以更改属性的行为。
  3. 调试目的。通过在访问器中设置断点,我们将能够知道何时以及属性发生了什么变化。
  4. 我们可以拥有一个仅设置的字段。例如,public set() 和 private get()。这在公共字段中是不可能的。

这确实为我们提供了更多的可能性和可扩展性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接