我是否应该在.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
属性是否只是提供了一种更有效的方法来做同样的事情?
在高性能应用程序中,属性是否会比上述访问器函数慢?
答案 0 :(得分:8)
内部属性只不过是一对方法。它们基本上评估为get和set访问器方法。
您应该使用属性,除非该属性会导致一些意外的,可能长时间运行的副作用,或者还有其他充分的理由使用方法。
有关详情,建议您阅读Property Usage Guidelines on MSDN。特别是,在以下情况下使用方法:
否则,我会使用一个属性。 Brad Abram's blogged some other details,包括某些API函数使用方法的充分理由(主要是因为它们可能导致跨计算机通信,这将属于“副作用”类别)。
答案 1 :(得分:3)
属性实际上是名为get_MyProperty
和set_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)
是的,至少根据我的经验,我试图避免使用属性并使用函数和例程。 以下是我的原因:
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
属性不太灵活,您必须返回相同的值。换句话说,您无法使用String
设置值,并使用Integer
或过载设置String
或Integer
。
现在公平地说,我使用属性的原因是获取设置的=
语法,当你有一个只读属性时,这不适用。还可以在属性对话框的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
通过这种方式,我从不担心我是否以正确的顺序解析属性,因为我基本上懒得加载它们。