为什么使用公共变量?

Kdg*_*Dev 4 c# variables access-modifiers

变量,方法和类可以获得各种安全级别.从我的C#经验来看,有:

公共
内部

保护的内部
私人

现在,我理解使用方法和类私有,或内部或受保护,但变量怎么样?即使我将变量设为私有,我也可以使用Property从不同的类中调用它.

我一直认为属性是最佳实践.因此,如果我可以使用它,我不需要通过实例直接调用变量.

有没有理由不将变量设为私有?

编辑:我看到有些人谈论属性,好像它们只不过是美化的公共变量

快速提醒:公共变量只返回它们的值.有了属性,您可以做更多.例如:

public int AmountOfBooks{
  get {
    //code to check certain conditions
    //maybe trigger an event while we're at it.
    //and a few conditionals.
    return this.amountOfBooks;
  }

  set {
    //a few conditionals
    //maybe trigger an event
    this.amountOfBooks = value;
    //and I can do even more... I think, never tried this.
  }
}
Run Code Online (Sandbox Code Playgroud)

那些读过我个人资料的人都知道我是学生.使用属性作为"荣耀的公共变量"是我看到许多同学所做的事情.告诉他们可以做到这一点时最常见的回答是:"这是允许的吗?"

Eri*_*ert 14

当然,在某些情况下,拥有一个公共领域是有意义的.例如,如果您要创建一个仅用于与现有非托管win32 API互操作的结构.

但是,如果要构建常规托管对象模型,最佳做法是将对象的属性建模为属性,并使用字段作为私有实现公开公开功能的机制.

更新:我将借此机会指出,我们已经尝试在C#3.0中轻松编写一个只访问后备存储的属性:

public int Foo { get; set; }
Run Code Online (Sandbox Code Playgroud)

与...完全相同

private int _Foo;
public int Foo { get { return _Foo; } set { _Foo = value; } }
Run Code Online (Sandbox Code Playgroud)

但是更短更容易阅读.当然,如果您需要稍后通过后备存储将其扩展为长形式,那么这样做并不是一个重大改变.

你也可以这样做:

public int Foo { get; private set; }
Run Code Online (Sandbox Code Playgroud)

如果你想为类/结构之外的代码创建一个只读的属性.

  • (1)将来将一个领域改为一个属性是一个突破性的变化.(2)属性用于对对象的*属性*进行建模.由此得名.假设你正在为汽车建模.颜色是汽车的*属性*吗?你有没有听过有人说颜色是汽车的*场*?当然不是.做出反映您正在建模的事物的选择; 具有属性的事物的模型属性. (4认同)

Ale*_*lli 6

如果在设置或获取变量时需要执行任何代码,则属性是最佳实践 - 或者如果您需要在将来添加此类代码时涉及API中的任何不兼容更改.

由于后一条款,在语言中"抢占式"使用访问器很可能是有意义的,否则需要进行这种不兼容的更改(最着名的例子是Java中的getThis/ setThis约定)!

但是当你的语言允许你从公共变量切换到属性而反之亦然而没有API中的任何不兼容的变化(例如C#,Ruby,Python,...)时,在公共访问器(getter)中携带总样板文件是愚蠢的.除了复制到私有变量之外什么也不做 - 除非你确定你的编译器可以优化它们,这样的样板访问器只是无用地膨胀源,并浪费了一个重要的设计特性,这是制作这些语言的一部分好的;-)

  • 将变量更改为属性是C#中不兼容的更改.当然语法是相同的,但它需要重新编译客户端代码. (2认同)