【问题标题】:Exposing Member Objects As Properties or Methods in .NET在 .NET 中将成员对象公开为属性或方法
【发布时间】:2025-12-26 10:10:07
【问题描述】:

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

【问题讨论】:

    标签: .net class properties methodology


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 当你有一些逻辑不仅仅是访问内存中的对象并返回该值时,或者当你正在执行一个具有对当前对象的状态有广泛的影响?
      【解决方案3】:

      这与此事无关。

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 嗯?属性集可以触发对象序列化并导致数据库更新或 Web 服务调用。怎么这么便宜?
        • 你说得对,属性可以做任何事情,因为它只是几个方法的语法糖。我的意思是说房产应该很便宜。如果不是,则使其成为显式方法。
        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          概览

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

          语法

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

          如果你将一个类的成员实现为一个属性,你必须这样修改它的值:

          ThisObject.ThisProperty(Index) = NewValue

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

          ThisObject.ThisProperty(Index, NewValue)

          错误

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

          【讨论】:

            【解决方案7】:

            我之前对 using 属性和方法感到困惑。但是现在我是按照MSDN Guideline使用这个规则的:

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

            【讨论】:

              最近更新 更多