在.NET中,如果一个类包含一个类对象的成员,那么该成员是应该作为属性公开还是使用方法公开?
您应该将属性用于概念上表示对象状态的任何内容,只要它的检索不是足够昂贵的操作,您应该避免重复使用它.
来自MSDN:
类库设计者通常必须决定将类成员实现为属性还是方法.通常,方法表示动作,属性表示数据.使用以下准则可帮助您选择这些选项.
当成员是逻辑数据成员时,请使用属性.在以下成员声明中,Name是属性,因为它是类的逻辑成员.
public string Name get { return name; } set { name = value; }使用方法时:
该操作是转换,例如Object.ToString.
操作非常昂贵,您希望与用户通信他们应该考虑缓存结果.
使用get访问器获取属性值会产生可观察到的副作用.
连续两次调用该成员会产生不同的结果.
执行顺序很重要.请注意,应该能够以任何顺序设置和检索类型的属性.
该成员是静态的,但返回一个可以更改的值.
该成员返回一个数组.返回数组的属性可能会产生误导.通常需要返回内部数组的副本,以便用户无法更改内部状态.这与用户可以轻易地认为它是索引属性的事实相结合,导致代码效率低下.在下面的代码示例中,每次对Methods属性的调用都会创建数组的副本.结果,将在以下循环中创建2n + 1个阵列副本.
Type type = // Get a type. for (int i = 0; i < type.Methods.Length; i++) { if (type.Methods[i].Name.Equals ("text")) { // Perform some operation. } }
以下示例说明了属性和方法的正确用法.
class Connection { // The following three members should be properties // because they can be set in any order. string DNSName {get{};set{};} string UserName {get{};set{};} string Password {get{};set{};} // The following member should be a method // because the order of execution is important. // This method cannot be executed until after the // properties have been set. bool Execute (); }
如果你所做的只是暴露一个与当前对象状态相关的对象实例,你应该使用一个属性.
当您有一些逻辑不仅仅是访问内存对象并返回该值时,或者当您执行的操作对当前对象的状态有广泛影响时,应该使用一种方法.