为什么实例变量总是私有的,但是 auto 属性 设置它们 public?还是一样?

Why are instance variables always private, but the auto property sets them public? Still the same?

我不明白的是,

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

通常:

private string name;

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

自动 属性:

public string Name { get; set; }

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

那么这会不会和之前的一模一样? :

public string name;

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

在理想的编程场景中,属性在暴露于外部时被声明 public。

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

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

一般来说,public 字段被认为是不好的做法,因为你给了那个 class 字段的用户全部权力。即使自动 属性 提供相同的功率,它更容易将 calculations/filters 添加到 setter 或 getter,或删除 setter 或getter 一共

通过创建支持字段 public,您将赋予用户完全忽略您设置的任何验证的权力。

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

如您在 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; }
}

所以你可以看到,实际的字段是存在的,但是它对每个人来说都是不可访问的,所以它就像是超级私有的。但是,有时您可能不希望这样。我已经 运行 进入了几次,我实际上希望 属性 的 class 能够访问私有支持字段以避免调用 set 和 gets,避免无限循环,虽然我觉得这可能是一种不好的做法,应该避免。

但重点是,汽车属性在幕后确实有一个私有字段,它们本身并不是私有字段。