在.NET中公开成员对象作为属性或方法

nom*_*der 14 .net methodology properties class

在.NET中,如果一个类包含一个类对象的成员,那么该成员是应该作为属性公开还是使用方法公开?

bdu*_*kes 20

您应该将属性用于概念上表示对象状态的任何内容,只要它的检索不是足够昂贵的操作,您应该避免重复使用它.

来自MSDN:

类库设计者通常必须决定将类成员实现为属性还是方法.通常,方法表示动作,属性表示数据.使用以下准则可帮助您选择这些选项.

  • 当成员是逻辑数据成员时,请使用属性.在以下成员声明中,Name是属性,因为它是类的逻辑成员.

    public string Name
    get 
    {
        return name;
    }
    set 
    {
        name = value;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用方法时:

    • 该操作是转换,例如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.
         }
      }
      
      Run Code Online (Sandbox Code Playgroud)

以下示例说明了属性和方法的正确用法.

    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 ();
    }
Run Code Online (Sandbox Code Playgroud)


Eri*_*ver 11

如果你所做的只是暴露一个与当前对象状态相关的对象实例,你应该使用一个属性.

当您有一些逻辑不仅仅是访问内存对象并返回该值时,或者当您执行的操作对当前对象的状态有广泛影响时,应该使用一种方法.