15

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

4

7 回答 7

25

您应该为任何概念上表示对象状态的东西使用属性,只要它的检索不是一个足够昂贵的操作,您应该避免重复使用它。

来自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 ();
    }
于 2008-10-02T20:53:34.473 回答
12

如果您所做的只是公开与当前对象的状态相关的对象实例,则应该使用属性。

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

于 2008-10-02T20:52:59.387 回答
3

这与此事无关。

如果值是关于对象状态的一些细节,它应该是一个属性。

如果它对对象执行某些操作,它应该是 Method。

于 2008-10-02T20:52:55.270 回答
1

财产。属性基本上只是一种“便宜”的方法。获取或设置对对象的引用非常便宜。

澄清一下,属性通常应该代表对象的内部状态。但是,将成员实现为属性或方法会告诉用户调用的成本可能有多高。

于 2008-10-02T20:51:53.960 回答
1

属性读取类中的实例并为其赋值。

方法对分配给类的数据做一些事情。

于 2008-10-02T20:51:54.617 回答
1

概述

通常,属性存储对象的数据,例如Name,方法是可以要求对象执行的操作,例如MoveShow。有时不清楚哪些类成员应该是属性,哪些应该是方法 - 集合类 (VB) 的Item方法存储和检索数据,并且可以作为索引属性实现。另一方面,将Item实现为方法也是合理的。

句法

类成员的使用方式也可能是决定它应该表示为属性还是方法的因素。从参数化属性中检索信息的语法几乎与作为函数实现的方法所使用的语法相同。但是,修改此类值的语法略有不同。

如果将类的成员实现为属性,则必须以这种方式修改它的值:

ThisObject.ThisProperty(Index) = NewValue

如果类成员被实现为方法,则必须使用参数来修改被修改的值:

ThisObject.ThisProperty(索引,新值)

错误

尝试将值分配给只读属性将返回与对方法的类似调用不同的错误消息。正确实现的类成员返回更容易解释的错误消息。

于 2008-10-02T21:11:03.853 回答
0

I confused about the using property and method before. But now I am using this rule according to MSDN Guideline:

methods represent actions and properties represent data. Properties are meant to be used like fields, meaning that properties should not be computationally complex or produce side effects. When it does not violate the following guidelines, consider using a property, rather than a method, because less experienced developers find properties easier to use.

于 2015-02-26T18:21:00.743 回答