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)
如果你想为类/结构之外的代码创建一个只读的属性.
如果在设置或获取变量时需要执行任何代码,则属性是最佳实践 - 或者如果您需要在将来添加此类代码时涉及API中的任何不兼容更改.
由于后一条款,在语言中"抢占式"使用访问器很可能是有意义的,否则需要进行这种不兼容的更改(最着名的例子是Java中的getThis/ setThis约定)!
但是当你的语言允许你从公共变量切换到属性而反之亦然而没有API中的任何不兼容的变化(例如C#,Ruby,Python,...)时,在公共访问器(getter)中携带总样板文件是愚蠢的.除了复制到私有变量之外什么也不做 - 除非你确定你的编译器可以优化它们,这样的样板访问器只是无用地膨胀源,并浪费了一个重要的设计特性,这是制作这些语言的一部分好的;-)