【问题标题】:Why are instance variables always private, but the auto property sets them public? Still the same? [duplicate]为什么实例变量总是私有的,而 auto 属性却将它们设置为公有的?还是一样? [复制]
【发布时间】:2016-05-27 05:13:48
【问题描述】:

我不明白的是,

我知道自动属性应该让事情变得更容易。

通常:

private string name;

public string Name
{
    get { return name; }
    set { name = value; }
}

使用自动属性:

public string Name { get; set; }

但是如果我们可以将实例变量声明为public,就像在auto属性中一样,为什么我们不将普通版本中的实例变量也声明为public呢?

那么这会和之前的完全一样吗? :

public string name;

public string Name
{
    get { return name; }
    set { name = value; }
}

【问题讨论】:

  • 字段或变量通常不会暴露在类之外,而属性是暴露的。这是一种更常见的做法。 auto 属性是按照惯例设计的。
  • 您可以在此链接中找到更多信息。 stackoverflow.com/questions/295104/…

标签: c# instance-variables


【解决方案1】:

在理想的编程场景中,属性被声明为公共的,因为它们暴露在外部。

另一方面,字段是私有的,因为它们不应该被公开,因为当它们的值发生变化时我们无法控制它们。另一方面,我们在属性上有这样的控制权。

【讨论】:

    【解决方案2】:

    尽管您可以做到这一点,但想象一下使用此 API 并看到您拥有 object.Nameobject.name。你怎么知道要使用哪一个?

    通常,公共字段被认为是不好的做法,因为您授予该类的用户字段的全部权限。尽管 auto 属性提供了相同的功能,但它可以更轻松地向 setter 或 getter 添加计算/过滤器,或者完全删除 setter 或 getter。

    通过公开支持字段,您可以让用户完全忽略您设置的任何验证。

    我想你可能会在这里感到困惑。

    正如您在this sharplab.io example 中看到的,

    public string Name { get; set; }
    

    编译成:

    private string <Name>k__BackingField;
    public string Name
    {
        get { return this.<Name>k__BackingField;  }
        set { this.<Name>k__BackingField = value; }
    }
    

    所以你可以看到,实际的字段是存在的,但是每个人都无法访问它,所以它就像超级私有。但是,有时您可能不想要这个。我遇到过几次我实际上希望属性的类能够访问私有支持字段以避免调用集合和获取,以避免无限循环,尽管我觉得这可能是一个不好的做法,并且应该避免。

    但重点是,汽车属性在幕后确实有一个私有字段,而不是它们自己的私有字段。

    【讨论】:

      猜你喜欢
      • 2014-08-03
      • 2017-04-02
      • 2011-11-29
      • 2023-04-04
      • 2013-12-17
      • 2010-10-18
      • 2011-10-22
      • 1970-01-01
      • 2015-06-09
      相关资源
      最近更新 更多