Вызов функции со свойством в качестве аргумента byref вызывает вызов метода set - PullRequest
0 голосов
/ 08 марта 2019

При вызове функции со свойством в качестве аргумента, объявленного byref, метод set свойства выполняется после вызова функции.

Это выдает ошибку компилятора, если это делается в c #, если вы пытаетесь передать свойство в функцию с ref, но в vb.net это происходит. Это ошибка? Что происходит?

Module Module1

    Private _testProp As Integer
    Property testProp As Integer
        Get
            Return _testProp
        End Get
        Set(value As Integer)
            Console.WriteLine("changed TestProp to " & value.ToString())
            _testProp = value
        End Set
    End Property

    Private Sub testFunction(ByRef arg As Integer)
        Console.WriteLine(arg)
    End Sub

    Sub Main()
        Console.WriteLine("explicit set to 5 in main")
        testProp = 5
        Console.WriteLine("calling function")
        testFunction(testProp)
        Console.ReadKey()
    End Sub

End Module

Выход:

явное значение 5 в основном
изменил TestProp на 5
вызывающая функция
5
изменил TestProp на 5

1 Ответ

0 голосов
/ 08 марта 2019

Передача свойства в параметр ByRef приводит к тому, что свойство передается путем копирования / копирования.Спецификация языка VB гласит:

Копирование с возвратом.Если тип переменной, передаваемой в ссылочный параметр, несовместим с типом ссылочного параметра, или если переменная (например, свойство) передается в качестве аргумента в ссылочный параметр, или если вызов имеет позднюю привязку, тогда временная переменная выделяется и передается в опорный параметр.Передаваемое значение будет скопировано во временную переменную перед вызовом метода и будет скопировано обратно в исходную переменную (если она есть и доступна для записи), когда метод вернется.

Так что это явно по дизайну, а не ошибка.

...