我应该公开我的类的属性吗?
在我所有的研究中,我都了解到,当我想让用户访问内部属性时,我不应该直接访问该属性,而是通过get/set方法给出访问权限,例如:我应该公开我的类的属性吗?
class myClass
{
private int x;
public void SetX (int x)
{
this.x = x;
}
public int GetX()
{
return this.x
}
}
因为它提供了允许程序员彻底更容易地改变发动机在不影响用户,更容易去窃听的额外的好处,并给出了检查输入的有效性更多的选择。但是,自从我开始在C#中学习和编写代码之后,我注意到大多数语言的“本机”类都暴露了它们的属性,例如设置/获取矩形的位置或大小(System.Drawing.Rectangle
) ,您可以直接访问X
,Y
,Width
和Height
属性。
我看到暴露属性的唯一好处是代码有点简单。是否有任何其他好处揭露物业?
当我应该公开的属性,什么时候应该不是我?
所以基本上,你的问题是性能相公共变量。何时使用什么?
阅读this Post,包括注释。
整个讨论的快速摘要:
- 思考的工作方式不同的变量与属性,所以如果依靠反射,
它更容易使用的所有属性。 - 你不能对数据绑定变量。
- 更改为属性变量是一个重大更改。
琐碎的属性实现暴露数据成员是没有或很少增益和大量的代码唯一合理的原因可能是:
提供只读成员访问var不了的由于某种原因而被声明为const
如果您正在编写一个组件供某些第三方使用,并且存在任何组件必须被替换而不需要这些用户重建(更改公共成员变量属性打破了整数erface,所以需要重建)。
而且,包裹公共领域的性质,原因有两个 - 一个是,你不能在不破坏二进制兼容性进行更改。二是你不能绑定到领域。
Reflection code against fields looks very different from reflection code against
properties (FieldInfo vs. PropertyInfo for starters). So even if you can
recompile against the new binary, if you use reflection on that field
you're hosed.
就像你说的,不是给你的变量直接访问的好处是,你可以改变执行不为你的类的用户进行任何更改。而在面向对象的编程方面,我认为这是一件重要的事情。
此外,通过使用属性,你仍然可以影响的“GET”或“set”的工作。这在某些情况下可能有用。
你混淆属性和字段。在C#中,属性可以像公共字段一样使用,但在内部调用它们的get/set方法。举个例子,有一个属性类是这样的:
class MyClass
{
// Field, direct access to the internal representation
private int x;
// Property, access via methods, but syntax like field access
public int X {
get { return this.x; } // generates a get-method "int get_X()"
set { this.x = value; } // generates a set-method "void set_X(int value)"
}
}
现在,当您设置属性X这样的:myClass.X = 42
,编译器将这种以myClass.set_X(42)
,这就要求在声明的方法set
块。 Field-like语法只是为了方便。
所以你应该更喜欢暴露set/get-methods。这只是在C#中,这样做的首选方法是通过属性,它将这些方法的实际调用抽象出来,并允许您像字段一样使用它们。
[阅读本文](http://www.codinghorror.com/blog/2006/08/properties-vs-public-variables.html)。阅读评论也 – 2013-03-24 14:41:56
@ManishMishra我打算写一些答案,但后来我读了您的评论,感谢您的链接 – Vamsi 2013-03-24 14:50:02
@ManishMishra,您的链接是伟大的,发布它作为一个答案(总结什么是写在那里)我会接受它。 – SIMEL 2013-03-25 07:10:47