Класс не обновляет переменные, переданные по ссылке

У меня есть класс в vb.net, определенный как общедоступный класс A

класс A создается при загрузке и вызывается один раз за цикл программы

Конструктор для класса A включает аргумент (byref Value as long)

У меня есть глобальная переменная с именем varB, которая передается классу A при создании.

теперь почему, когда varB изменяется во время программного цикла, это изменение не отражается в классе?


person Tony Raymond    schedule 05.05.2012    source источник


Ответы (1)


Если бы это было так просто... ByRef работает только внутри подпрограммы/функции, которую вы вызвали, для изменения переменной, которую вы "отправляете", и после возврата из этой подпрограммы/функции больше никаких изменений не производится.

Public Class ClassOne
    Public ValuefromClassOne As Integer
    Public Sub ChangeAValue(ByRef AValue As Integer)
        AValue = 12   ' This will modifiy the variable
        ValuefromClassOne = AValue   ' this will ONLY put 12 inside ValueFromClassOne
    End Sub
End Class

Public Class ClassTwo
    Public ValueFromClassTwo As Integer
    Public Sub CallToClassOne()
        ChangeAValue(ValueFromClassTwo)    ' this will ONLY put 12 into ValueFromClassTwo
        ValueFromClassTwo = 25    ' this will have effect only on ValueFromClassTwo - no link
    End Sub
End Class

Итак, если вы хотите иметь значение, вам нужно использовать объект (определить новый класс)

Public Class IntegerHolder
    Public Property AnInteger As Integer
End Class

Public Class ClassOne
    Public ValuefromClassOne As IntegerHolder
    Public Sub ChangeAValue(ByVal AValue As IntegerHolder)
        AValue.AnInteger = 12   ' This will modifiy the variable
        ValueFromClassOne.AnInteger = AValue.AnInteger   ' this will ONLY put 12 inside ValueFromClassOne
        ' !!!!! BUT with this : !!!!
        ValueFromClassOne = AValue
        ' Now you hold a copy of the variable given in argument of ChangeAValue 
    End Sub
End Class

Public Class ClassTwo
    Public ValueFromClassTwo As New IntegerHolder
    Public Sub CallToClassOne()
        ChangeAValue(ValueFromClassTwo)    ' this will ONLY put 12 into ValueFromClassTwo
        ValueFromClassTwo.AnInteger = 25    ' this will have effect on
        ' ValueFromClassTwo  AND  ValuefromClassOne
    End Sub
End Class

Но обратите внимание, что изменение в ValueFromClassTwo будет отражено, но не уведомлено: используйте общедоступное общее событие в ClassTwo, чтобы уведомить / добавить обработчик события в ClassOne, чтобы получить уведомление.

person GameAlchemist    schedule 05.05.2012