在.NET中将成员对象暴露为属性或方法

16

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

7个回答

27

对于任何概念上代表对象状态的东西,你应该使用属性来表示,只要它的检索不是足够昂贵的操作,你就可以重复使用它。

来自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 ();
    }

13
如果你只是暴露与当前对象状态相关的对象实例,应该使用属性(property)。
当你有一些逻辑需要做更多的事情而不仅是访问内存中的对象并返回该值时,或者当你正在执行对当前对象状态具有广泛影响的操作时,应该使用方法(method)。

当您需要执行的逻辑不仅仅是访问内存中的对象并返回该值,或者当您正在执行对当前对象状态具有广泛影响的操作时,使用方法而不是属性的好处是什么? - David Klempfner

3

这与问题无关。

如果值是对象状态的某些细节,它应该是属性。

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


1

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

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


什么?属性集可以触发对象序列化并导致数据库更新或Web服务调用。这听起来很便宜,不是吗? - Franci Penov
1
你说得对,属性可以做任何事情,因为它只是一些方法的语法糖。我的意思是说,属性应该是便宜的。如果不是,那就把它变成一个显式的方法。 - Rodrick Chapman

1

属性读取并为类中的实例分配值。

方法对分配给类的数据执行某些操作。


1

概述

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

语法

类成员将如何使用也可能是确定其是否应表示为属性或方法的决定性因素。从参数化属性中检索信息的语法与作为函数实现的方法所使用的语法几乎相同。但是,修改这种值的语法略有不同。

如果将类成员实现为属性,则必须以以下方式修改其值:

ThisObject.ThisProperty(Index) = NewValue

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

ThisObject.ThisProperty(Index, NewValue)

错误

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


0

我曾经对属性和方法的使用感到困惑。但现在我根据MSDN指南遵循以下规则:

方法表示动作,属性表示数据。 属性应像字段一样使用,这意味着属性不应计算复杂或产生副作用。 当不违反以下准则时,请考虑使用属性而不是方法,因为经验不足的开发人员更容易使用属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接