首页 文章

公共字段与自动属性

提问于
浏览
303

我们经常被告知我们应该通过为类字段制作getter和setter方法(C#中的属性)来保护封装,而不是将字段暴露给外部世界 .

但是很多时候,字段只是存在一个值,并且不需要任何计算来获取或设置 . 对于这些,我们都会这样做:

public class Book
{
    private string _title;

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

好吧,我有一个坦白,我不忍心写所有这些(真的,它不必写它,它不得不看它),所以我去流氓和使用公共领域 .

然后是C#3.0,我看到他们添加了自动属性:

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

这更整洁,我很感激它,但是真的,有什么不仅仅是 Build 一个公共领域?

public class Book
{
    public string Title;
}

10 回答

  • 153

    忽略API问题,我发现使用属性最有 Value 的是调试 .

    CLR调试器不支持数据断点(大多数本机调试器都支持) . 因此,不可能在类的特定字段的读取或写入上设置断点 . 这在某些调试方案中非常有限 .

    由于属性是作为非常精简的方法实现的,因此可以在读取和写入其值时设置断点 . 这使他们在田野上占了一席之地 .

  • 7

    制作字段 public 没有错 . 但是记得用 private 字段创建 getter/setter 是没有封装的 . IMO,如果您不关心 Property 的其他功能,您可以将其设为 public .

  • 72

    从字段更改为属性会破坏 Contract (例如,需要重新编译所有引用代码) . 因此,当您与其他类(任何公共(通常受保护的)成员) Build 交互点时,您希望计划未来的增长 . 通过始终使用属性来这样做 .

    今天没有什么可以使它成为一个自动 property ,并且在线下3个月意识到你想让它延迟加载,并在getter中进行空检查 . 如果您使用了一个字段,那么这是一个最好的重新编译更改,最坏的情况是不可能的,这取决于谁和什么依赖于您的程序集 .

  • 10

    我觉得非常有用的一件事以及所有代码和测试的原因是,如果它是属性vs字段,则Visual Studio IDE会显示属性的引用但不显示字段 .

  • 43

    一个经常被忽视的巨大差异,在任何其他答案中都没有提到: overriding . 您可以声明属性虚拟并覆盖它们,而不能对公共成员字段执行相同操作 .

  • 0

    这完全是关于版本控制和API稳定性的 . 在版本1中没有区别 - 但稍后,如果您决定需要在版本2中将此属性设置为某种类型的错误检查,则无需在任何地方更改API,无需更改代码, property 的定义 .

  • 7

    仅仅因为没有人提到它:你不能在接口上定义字段 . 因此,如果您必须实现定义属性的特定接口,则自动属性有时是一个非常好的功能 .

  • 57

    在我之前的一段时间里,在Jeff的博客上发布了一个链接,解释了一些差异 .

    Properties vs. Public Variables

    • 反射在变量与属性上的工作方式不同,因此如果依赖于反射,则更容易使用所有属性 .

    • 您无法对变量进行数据绑定 .

    • 将变量更改为属性是一个重大变化 . 例如:

    TryGetTitle(out book.Title); // requires a variable
    
  • 0

    自动实现的属性相对于公共字段的另一个优点是,您可以将set访问器设置为私有或受保护,从而提供对象类,其中定义的对象类比公共字段更好地控制 .

  • 56

    如果您稍后决定检查 Headers 是否唯一,则通过与集合或数据库进行比较,您可以在属性中执行此操作,而无需更改任何依赖于它的代码 .

    如果只使用公共属性,那么灵活性就会降低 .

    在不违反 Contract 的情况下,额外的灵活性对我来说最重要的是使用属性,直到我真正需要灵活性,自动生成才是最有意义的 .

相关问题