有人可以向我解释 Get 和 Set 属性的概念吗?它只是不适合我。
5 回答
这不是 vb.net 原生的概念。它是 .net 框架和 oop 的一部分。长话短说,这只是客户使用/与对象交互的方式,以迫使他/她遵循特定的使用模式。这是一种在可以实现某些逻辑的层之后读取/设置私有成员/变量值的方法。例如,在一个名为 Account 的类的 setter 实现中。假设它有一个名为 Balance 的属性,它是字符串数据类型(例如缘故),但只有数值。
Dim acc as New Account("CustID-1234")
acc.Balance = "1234" 'This is valid
acc.Balance = "Ten thousand" 'this is wrong
因此,为了提供对象数据的一致性(在读取/设置时),我们分别有 getter 和 setter。
现在上面类的setter可以写成这样:
Public Class Account
'...Var dec
Public Property Balance() As String
Get
Return m_iBal.ToString()
Set (value As String)
Dim i As Integer
If Integer.TryParse(value, i) Then
m_Bal = i
Else
'You can throw a nasty error
End If
End Property
End Class
我不使用 Visual Basic,但原理是这样的:
您的班级中有一个private
变量,我们称之为myNumber
(这将是一些数字类型)。无论出于何种原因,您都不想允许public
访问此变量。
您将为此变量创建一个 get 和一个 set 方法(也称为 accessor 和 mutator 方法),它们的访问级别为 public。这将允许您更好地控制值的设置或检索方式。这是一些伪代码:
getMyNumber(){
return myNumber;
}
setMyNumber(value){
if(value > 0){
myNumber = value;
}
}
使用此 setter 方法,您可以确保myNumber
永远不会将其设置为 0 或负值(例如)。
说得通?
Mutators (setter) 和 Accessors (getter) 是覆盖赋值运算符的一种偷偷摸摸的方式。所以,你有一个公共领域,classicalSize。您可以轻松获取和设置其值:
int localVariable = 3000000;
MyClass.classroomSize = localVariable;
localVariable = MyClass.classroomSize;
但是如果你知道整个学校只有 300 把椅子呢?您使用 mutator 将分配值限制为 <= 300。使用 mutator,您不必为您的班级用户增加调用 SetClassroomSize(300) 的负担,而是允许他们像字段一样分配您的属性。
这是一个简明扼要的例子。实际上,您很可能希望在教室大小超过合理值时抛出异常,而不是覆盖该值。在 mutator(或访问器)中抛出异常是一种不好的形式。因此,在这种情况下,您实际上想要创建一个 SetClassroomSize() 方法。但你明白了。
至于自动创建只不过是设置和获取类的私有字段,除了1)它们可以显示在自定义控件中,而字段不能,2)一些协议(COM/DCOM? ) 要求他们分配,3) 他们提供访问限制(ReadOnly 和 WriteOnly 属性在字段中没有等效项),4) 六个月后,有人将需要将您的公共字段转换为私有字段并为所有人创建访问器和修改器他们中的一个,并且可能会因为不得不做你的苦差事而咒骂。
你有一个属性,它可以有一个 getter 和一个 setter 的某种组合。getter 是从属性读取时运行的代码。此代码必须返回一个值。setter 是分配给属性时运行的代码。
Get
使用和访问器创建属性Set
允许您创建行为类似于变量的函数。
例如,假设您正在制作一个带有标签的 UserControl,并且您希望让使用用户控件的人获取和设置标签的文本,而不让他们访问标签本身。(请注意,如果他们真的想要,他们可以通过Controls
属性访问它)
您可以创建一对类似GetLabelText
and的方法SetLabelText
,其他人可以调用它们来更改标签。但是,调用这样的方法很尴尬。例如,如果有人想将字母附加A
到标签上,他们必须这样做:control.SetLabelText(control.GetLabelText() + "A")
. 如果你创建一个LabelText
属性, wh=ithGet
和Set
访问器而不是GetLabelText
and SetLabelText
,他们可以简单地写control.LabelText += "A"
.
当您编写一个属性时,您可以像编写常规函数一样 编写访问器Get
和访问器。不接受参数并返回属性的值,并将属性的新值作为隐藏参数调用,并且不返回任何内容。Set
Get
Set
Value
例如:
Public Property LabelText
Get
Return label.Text
End Get
Set
label.Text = value
End Set
End Property