Средства доступа к свойствам в Visual Basic .Net

StackOverflow https://stackoverflow.com/questions/1638391

  •  08-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Это понятие не является родным для 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

Другие советы

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

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

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

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

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

Имеет смысл?

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

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

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

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

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

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

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

Вы можете создать пару методов, таких как GetLabelText и SetLabelText, которые другие люди могут вызывать для изменения метки. Однако вызывать такие методы неудобно. Например, если кто-то хочет добавить букву A к ярлыку, он должен будет сделать что-то вроде этого: control.SetLabelText(control.GetLabelText() + "A"). Если вы создадите свойство LabelText, которое будет использовать control.LabelText += "A" и Value вместо <=> и <=>, они могут просто написать <=>.

Когда вы пишете свойство, вы пишете методы доступа <=> и <=> как обычные функции. <=> не принимает параметров и возвращает значение свойства, а <=> принимает новое значение для свойства как скрытый параметр с именем <=> и ничего не возвращает.

Например:

Public Property LabelText
    Get
        Return label.Text
    End Get
    Set
        label.Text = value
    End Set
End Property

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top