.NET - 我应该何时使用属性与变量+访问器函数?

时间:2009-11-02 21:42:00

标签: .net vb.net properties

我是否应该在.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

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

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

5 个答案:

答案 0 :(得分:8)

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

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

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

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

“仅”部分中仅提供了属性。

我维护的应用程序在数据库中有很多持久化对象,这些对象之间存在很多关系。例如学生有老师,老师在数据库中存在。

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

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

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

如果有人对此方法有任何意见,我很乐意听到。

答案 3 :(得分:1)

是的,至少根据我的经验,我试图避免使用属性并使用函数和例程。 以下是我的原因:

  1. 无法对委托使用属性。我相信你可以在C#但在
  2. 属性具有欺骗性,它们看起来像成员,但行为类似于函数。因此,虽然您可能认为您只是在查看成员值,但实际上您可能会重新初始化整个系统,因为实施开发人员滥用了惰性实例化。
  3. Less Code,虽然它不是一个巨大的数量,但在VB中定义属性需要每个get或set至少增加2行代码。 Overhead是单个赋值或返回操作的实际代码行的两倍。尽管这很小,但是阅读代码变得更加困难,但VB已经是一种痴迷的语言。

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

    VS

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

    < / LI>

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

答案 4 :(得分:1)

使用N-Tier设计,在我的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

通过这种方式,我从不担心我是否以正确的顺序解析属性,因为我基本上懒得加载它们。