Подтвердить что ты не робот

Почему у установщика свойства 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 (я попробовал, он дал ошибку), то какое использование этого также?

4b9b3361

Ответ 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

У вас может быть значение как перечисление и, например, сделать выбор, например, и установить значение таким образом. Вам не нужно ограничивать вызов набора свойств, передавая только тот же тип значения, который является приятной функцией