代码之家  ›  专栏  ›  技术社区  ›  tahdhaze09

Visual Basic.NET中的属性访问器

  •  1
  • tahdhaze09  · 技术社区  · 14 年前

    有人能给我解释一下get和set属性的概念吗?我可不想沉迷其中。

    5 回复  |  直到 11 年前
        1
  •  2
  •   deostroll    14 年前

    这不是vb.net固有的概念。它是.NET框架和OOP的一部分。长话短说,这只是客户机使用/与对象交互的方式,以迫使他/她遵循特定的使用模式。它是一种在可以实现某些逻辑的层之后读取/设置私有成员/变量的值的方法。例如,在名为account的类的setter实现中。假设它有一个名为balance的属性,它是string数据类型(例如,为了方便起见),但只有数值。

    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
    
        2
  •  2
  •   brettkelly    14 年前

    我不使用Visual Basic,但原理如下:

    你有一个 private 类中的变量,我们称之为 myNumber (这是某种数字类型)。你不想允许 public 无论什么原因都可以访问这个变量。

    您将为此变量(也称为访问器和赋值器方法)创建一个get和set方法,该变量的访问级别为public。这将允许您更多地控制如何设置或检索值。以下是一些伪代码:

    getMyNumber(){
         return myNumber;
    }
    setMyNumber(value){
         if(value > 0){
             myNumber = value;
         }
    }
    

    使用这个setter方法,您可以确保 我的号码 不能设置为0或负值(例如)。

    有道理?

        3
  •  2
  •   knockNrod    11 年前

    mutator(setter)和accessors(getter)是一种隐藏的重写赋值运算符的方法。所以,你有一个公共场地,教室大小。您可以轻松获取和设置其值:

    int localVariable = 3000000;
    MyClass.classroomSize = localVariable;
    localVariable = MyClass.classroomSize;
    

    但是如果你知道整个学校只有300把椅子怎么办?使用赋值函数将赋值限制为<=300。使用mutator,您不必让类的用户负担调用setClassRoomSize(300)的负担,而是允许他们像字段一样分配您的属性。

    这是一个很糟糕的例子。事实上,当教室大小超过合理值时,您很可能希望抛出异常,而不是覆盖该值。在一个变元(或访问器)内部抛出异常是一种糟糕的形式。因此,在本例中,您实际上需要创建一个setClassRoomSize()方法。但你明白了。

    至于自动创建,除了设置和获取类的私有字段之外,它们中只有很少的值,除了,1)它们可以在自定义控件中显示,而字段不能,2)一些协议(COM/DCOM?)需要它们来进行分配,3)它们提供访问限制(只读和只写属性在字段中没有等价的属性),4)六个月后,有人将需要将您的公共字段转换为私有字段,并为所有字段创建访问器和变异器,并且可能会指责必须做您的工作。

        4
  •  1
  •   SLaks    14 年前

    Get Set 访问器允许您使函数的行为类似于变量。

    例如,假设您正在创建一个带有标签的用户控件,并且您希望让使用用户控件的人员获取和设置标签的文本,而不让他们访问标签本身。(注意,如果他们真的想要,他们可以通过 Controls 财产)

    你可以用两种方法 GetLabelText SetLabelText ,其他人可以调用它来更改标签。然而,这样的方法调用起来很尴尬。例如,如果有人想附加这封信 A 对于标签,他们必须这样做: control.SetLabelText(control.GetLabelText() + "A") . 如果你做了 LabelText 属性,wh=ith 得到 集合 访问器而不是 获取标签文本 设置标记文本 他们可以简单地写 control.LabelText += "A" .

    当你写一个属性时,你写 得到 集合 访问器喜欢常规函数。 得到 不接受任何参数并返回属性的值,以及 集合 将属性的新值作为名为 Value 而且什么也不退。

    例如:

    Public Property LabelText
        Get
            Return label.Text
        End Get
        Set
            label.Text = value
        End Set
    End Property
    
        5
  •  1
  •   Joel Coehoorn    14 年前

    你有 属性可以具有getter和setter的某种组合。getter是在 读取自 财产。本代码 必须 返回一个值。setter是在 指派给 财产。