【问题标题】:.NET - When should I use a property vs. variable + accessor function?.NET - 我什么时候应该使用属性与变量 + 访问器函数?
【发布时间】:2010-12-12 10:38:54
【问题描述】:

是否存在我应该在 .NET 中执行以下操作而不是使用具有读/写功能的属性的情况?

private S as string

public function GetS() as string
     return S
end function

public sub SetS(byval NewS as string)
    S = NewS
end function

属性是否只是提供了一种更有效的方式来做同样的事情?

在高性能应用程序中,属性会比上述访问器函数慢吗?

【问题讨论】:

标签: .net vb.net properties


【解决方案1】:

对于 N 层设计,在我的 BO 中,我存储具有未设置值的属性值,然后在第一次访问时设置它。

Private _aValue As integer =-1 
    Private ReadOnly Property aValue As integer
    Get
        If _aValue = -1 Then
            _aValue = DA.General.GetaValue()
        End If
        Return _aValue
    End Get
End Property

这样,我就不用担心是否以正确的顺序解析属性,因为我基本上是延迟加载它们。

【讨论】:

    【解决方案2】:

    关于是否使用属性或函数的另一个决定是在实例化父对象时。 VB 有非常方便的语法,例如

    Dim MyStudent as Student With {.Name = "Bobby", .Age = 10}
    

    With 部分中只有属性可用。

    我维护了一个应用程序,它在数据库中有很多持久化的对象,其中有很多对象之间的关系。例如一个学生有一个老师,并且老师在数据库中被持久化。

    我通常使用 WriteOnly 属性来设置教师,因为这是一个轻量级的操作,但考虑到检索教师可能需要昂贵的数据库访问,我使用一个函数来检索。换句话说:

    Public Writeonly Property Teacher() as Teacher
    Public Function GetTeacher() as Teacher
    

    这让我可以以 With {.Teacher = SomeTeacherObject} 的形式实例化一个 Student,但 GetTeacher 鼓励在用户代码中缓存 Teacher 对象,而不仅仅是将其用作可能会或可能不会导致多个 DB 访问调用的属性。

    如果有人对这种方法有任何意见,我很想听听他们的意见。

    【讨论】:

      【解决方案3】:

      是的,至少根据我的经验,我尽量避免使用属性并使用适当的函数和例程。 以下是我的理由:

      1. 不能对委托使用属性。我相信你可以在 C# 中,但在
      2. 属性具有欺骗性,它们看起来像成员,但行为却像函数。因此,尽管您可能认为您只是在查看成员值,但实际上您可能正在重新初始化整个系统,因为实施开发人员滥用了惰性实例化。
      3. 代码更少,虽然数量不多,但在 VB 中定义属性每次获取或设置至少需要 2 行额外的代码。对于单个赋值或返回操作,开销是实际代码行数的两倍。尽管这让阅读代码变得更加困难,但 VB 已经是一种令人着迷的语言。

        Private ReadOnly Property Foo As String
            Get
                Return Bar
            End Get
        End Property
        

        Private Function Foo As String
            Return Bar
        End Function
        
      4. 属性不太灵活,您必须返回获得的相同值。换句话说,您不能使用String 设置值并使用Integer 或使用StringInteger 的重载设置。

      现在公平地说,我使用属性的原因是获取= 语法进行设置,这在您拥有只读属性时不适用。也可以在 VS 编辑器的属性对话框中设置属性。

      【讨论】:

        【解决方案4】:

        属性实际上是称为get_MyPropertyset_MyProperty 的方法的语法糖,因此没有性能差异。

        【讨论】:

          【解决方案5】:

          在内部,属性只不过是一对方法。它们基本上评估为 get 和 set 访问器方法。

          您应该使用属性,除非该属性会导致一些意想不到的、可能长期运行的副作用,或者有其他使用方法的充分理由。

          有关详细信息,我建议阅读Property Usage Guidelines on MSDN。特别是,在以下情况下使用方法:

          • 操作是一种转换,比如Object.ToString。
          • 该操作的开销太大,以至于您想与用户沟通,让他们考虑缓存结果。
          • 使用 get 访问器获取属性值会产生可观察到的副作用。
          • 连续两次呼叫成员会产生不同的结果。
          • 执行顺序很重要。请注意,类型的属性应该能够以任何顺序设置和检索。
          • 成员是静态的,但返回一个可以更改的值。
          • 成员返回一个数组。

          否则,我会使用属性。 Brad Abram's blogged some other details,包括某些 API 函数使用方法的充分理由(主要是因为它们可能导致跨计算机通信,属于“副作用”类别)。

          【讨论】:

          • @Reed - 为什么会有人需要私有财产?
          • 它可以更轻松地添加在事情完成时发生的逻辑,并简化版本控制(如果以后,您决定需要在其中设置额外的逻辑)。简单的属性会被 JIT 内联,因此没有理由避免使用它们。此外,私有属性可以与数据绑定一起使用。
          • “成员返回一个数组”实际上应该概括为“成员返回一个引用类型的可变对象,该对象不再属于该成员所属的对象”。
          • @Reed - 这有点帮助。听起来您将为对象的内部提供一些包装。对于简单的字符串或整数成员来说,这可能不是最聪明的做法,但对于捕获有关对象的一些元信息可能非常有用。我是否走在财产预期用途的正确道路上?感谢上面的链接。
          • 是的。如果您认为您可能想要提供“包装器”,这是一个好主意。例如,如果稍后您想要实现 INotifyPropertyChanged,或进行一些其他更改跟踪,将私有作为属性很有用,因为您可以在不更改其他代码的情况下更改它。
          猜你喜欢
          • 1970-01-01
          • 2012-06-10
          • 1970-01-01
          • 2010-12-30
          • 1970-01-01
          • 2011-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多