Средства доступа к свойствам в Visual Basic .Net
Вопрос
Может ли кто-нибудь объяснить мне концепцию свойств 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
У вас есть одно свойство, которое может содержать комбинацию метода получения и установки. Получатель - это код, который запускается при чтении из свойства. Этот код должен вернуть значение. Сеттер - это код, который запускается при назначении свойства.