Средства доступа к свойствам в Visual Basic .Net - PullRequest
2 голосов
/ 28 октября 2009

Может ли кто-нибудь объяснить мне концепцию свойства Get и Set? Это просто не для меня.

Ответы [ 5 ]

3 голосов
/ 28 октября 2009

Это понятие не является родным для vb.net. Это часть .net Framework и опа. Короче говоря, это просто способ, которым клиент использует / взаимодействует с объектом, чтобы заставить его / ее следовать определенному образцу использования. Это способ чтения / установки значений закрытых членов / переменных после слоя, где можно реализовать некоторую логику. Например, в сеттерной реализации класса под названием Account. Допустим, у него есть свойство Balance, которое имеет строковый тип данных (например, сакэ), но имеет только числовые значения.

Dim acc as New Account("CustID-1234")
acc.Balance = "1234" 'This is valid
acc.Balance = "Ten thousand" 'this is wrong

Следовательно, для обеспечения согласованности в данных объекта (при чтении / настройке) у нас есть геттеры и сеттеры соответственно.

Теперь установщик для вышеуказанного класса можно записать так:

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 голосов
/ 16 ноября 2012

Мутаторы (сеттеры) и аксессоры (геттеры) - это хитрый способ переопределить оператор присваивания. Итак, у вас есть публичное поле, classroomSize. Вы можете легко получить и установить его значение:

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

Но что если вы знаете, что во всей школе всего 300 стульев? Вы используете мутатор, чтобы ограничить значение присваивания значением <= 300. Используя мутатор, вам не нужно обременять пользователя вашего класса вызовом SetClassroomSize (300), и вместо этого им разрешается присваивать ваше свойство как поле. </p>

Это плохой пример для краткости. По правде говоря, вы, скорее всего, захотите создать исключение, когда размер класса превысил разумное значение, а не переопределять это значение. И бросать исключения внутри мутатора (или метода доступа) - это плохая форма. Таким образом, в этом случае вы фактически захотите создать метод SetClassroomSize (). Но вы поняли.

Что касается автоматического создания, которое не делает ничего, кроме установки и получения закрытого поля класса, в них мало значения, кроме, 1) они могут отображаться в пользовательских элементах управления, тогда как поле не может, 2) некоторые протоколы (COM). / DCOM?) Требуют их для назначения, 3) они предоставляют ограничения доступа (свойства ReadOnly и WriteOnly не имеют эквивалента в полях), 4) через шесть месяцев кому-то потребуется преобразовать ваши открытые поля в частные поля и создать средства доступа и мутаторы для всех из них и, вероятно, будут ругаться на то, что вам придется выполнять вашу рутинную работу.

2 голосов
/ 28 октября 2009

Я не использую Visual Basic, но принцип работает так:

В вашем классе есть переменная private, назовем ее myNumber (это будет некоторый числовой тип). Вы не хотите разрешать public доступ к этой переменной по любой причине.

Вы бы создали метод get и set для этой переменной (также называемые методами доступа и мутатора), который имел бы уровень доступа public. Это позволит вам лучше контролировать, как значение устанавливается или восстанавливается. Вот некоторый псевдокод:

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

С помощью этого метода установки вы можете убедиться, что myNumber никогда не может быть установлен в 0 или отрицательное значение (например).

Имеет смысл?

1 голос
/ 28 октября 2009

Создание свойства с помощью методов доступа Get и Set позволяет создавать функции, которые ведут себя как переменные.

Например, предположим, что вы создаете UserControl с меткой, и вы хотите, чтобы люди, использующие пользовательский элемент управления, получали и устанавливали текст метки, не предоставляя им доступ к самой метке. (Обратите внимание, что если они действительно хотят, они могут получить к нему доступ через свойство Controls)

Вы можете создать пару методов, таких как GetLabelText и SetLabelText, которые другие люди могут вызывать для изменения метки. Однако вызывать такие методы неудобно. Например, если кто-то хочет добавить к ярлыку букву A, он должен будет сделать что-то вроде этого: control.SetLabelText(control.GetLabelText() + "A"). Если вы сделаете свойство LabelText, в котором вместо GetLabelText и SetLabelText используются методы доступа 101 * * и Set, они могут просто написать 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
1 голос
/ 28 октября 2009

У вас есть одно свойство, которое может иметь некоторую комбинацию геттера и сеттера. Получатель - это код, который запускается, когда вы читаете из свойства. Этот код должен возвращать значение. Сеттер - это код, который запускается, когда вы назначаете свойство.

...