为什么实例变量总是私有的,但是 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.Name
和 object.name
。您怎么知道要使用哪一个?
一般来说,public 字段被认为是不好的做法,因为你给了那个 class 字段的用户全部权力。即使自动 属性 提供相同的功率,它更容易将 calculations/filters 添加到 setter 或 getter,或删除 setter 或getter 一共
通过创建支持字段 public,您将赋予用户完全忽略您设置的任何验证的权力。
我想你可能在这里感到困惑。
中所见
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,避免无限循环,虽然我觉得这可能是一种不好的做法,应该避免。
但重点是,汽车属性在幕后确实有一个私有字段,它们本身并不是私有字段。
我不明白的是,
我知道自动 属性 应该会让事情变得更容易。
通常:
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.Name
和 object.name
。您怎么知道要使用哪一个?
一般来说,public 字段被认为是不好的做法,因为你给了那个 class 字段的用户全部权力。即使自动 属性 提供相同的功率,它更容易将 calculations/filters 添加到 setter 或 getter,或删除 setter 或getter 一共
通过创建支持字段 public,您将赋予用户完全忽略您设置的任何验证的权力。
我想你可能在这里感到困惑。
中所见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,避免无限循环,虽然我觉得这可能是一种不好的做法,应该避免。
但重点是,汽车属性在幕后确实有一个私有字段,它们本身并不是私有字段。