Почему у установщика свойства VB.NET требуется типизированный аргумент и почему это ByVal?
В С# ключевое слово set set value
автоматически будет таким же, как тип свойства.
Например, в С# тип value
равен string
private string str = string.Empty;
public string MyText
{
get { return str; }
set { str = value; }
}
Если мы преобразуем этот фрагмент в VB.Net, мы получим
Private str As String = String.Empty
Public Property MyText() As String
Get
Return str
End Get
Set(ByVal value As String)
str = value
End Set
End Property
Вопросы
-
Почему у этой строки есть строка Set(ByVal value As String)
? Не следует указывать тип
автоматически будет String. Таким образом.
Private str As String = String.Empty
Public Property MyText() As String
Get
Return str
End Get
Set
str = value
End Set
End Property
Какое использование этого?
-
Я не могу изменить BYVal
на ByRef
(я попробовал, он дал ошибку), то какое использование этого также?
Ответы
Ответ 1
Вы можете опустить часть (ByVal value As String)
. Visual Studio будет продолжать добавлять его, но это не требуется ни языком, ни компилятором.
Вы можете использовать имя параметра, отличное от value
. Также обратите внимание, что с VS2010 SP1 вы можете опустить ключевое слово ByVal
.
Пример:
Class Test
Private str As String = String.Empty
Public Property MyText() As String
Get
Return str
End Get
Set
str = value
End Set
End Property
Public Property MyText2() As String
Get
Return str
End Get
Set(something As String)
str = something
End Set
End Property
End Class
Ответ 2
Я думаю, его часть синтаксиса в Visual Basic. Вы можете опустить тип данных, если OptionStrict
не включен. Но если вы укажете тип, он должен быть таким же, как и для типа свойства.
Из MSDN - Установить выражение (Visual Basic)
тип данных
Требуется, если параметр Strict включен. Тип данных параметра значения. тип данных, указанный должен быть таким же, как тип данных свойства где объявлен этот оператор Set.
Ответ 3
Поскольку вам разрешено в VB изменять имя параметра:
Public Property MyText() As String
Get
Return str
End Get
Set(ByVal val As String)
str = val
End Set
End Property
Вы не можете изменить ByVal
на ByRef
, поскольку параметры свойства могут быть переданы только по значению. Но VB иногда предпочитает утверждать факты, которые неизменны.
Разработчики могли (теоретически) позволить вам просто:
Set(val)
Потому что ничего другого нельзя изменить. Но они решили сделать параметры для свойств похожими на параметры для Function
и Sub
s.
Фактически, вам не нужно указывать параметр вообще. По языку VB (9.7.2):
Если указан список параметров, он должен иметь один член, этот член не должен иметь никаких модификаторов, кроме ByVal
, и его тип должен быть таким же, как тип свойства. Параметр представляет заданное значение свойства. Если параметр опущен, параметр с именем Value
неявно объявляется
И (9.5.2):
Параметр, который не указывает ByRef
или ByVal
по умолчанию ByVal
.
Ответ 4
Если значение было ByRef, Setter мог бы изменить значение вызывающего абонента. Не имеет смысла позволять установщику свойств вызвать такие побочные эффекты.
Ответ 5
У вас может быть значение как перечисление и, например, сделать выбор, например, и установить значение таким образом. Вам не нужно ограничивать вызов набора свойств, передавая только тот же тип значения, который является приятной функцией