Как изменить значение ссылочной переменной, хранящейся в классе? - PullRequest
0 голосов
/ 22 февраля 2020

В общем, я хочу сохранить ссылку на логическое значение в моем классе.

Это выглядит примерно так:

Public Class TestClass
    Private boolRef As Boolean

    Public Sub New(ByRef inBoolRef As Boolean)
        boolRef = inBoolRef 'Assign reference of "inBoolRef" to "boolRef"
    End Sub

    Public Sub changeBool()
        boolRef = true 'Change value of the referenced boolean variable (outside of this class)
    End Sub

End Class

Объект этого класса работает в параллельном потоке, и поэтому я хочу, чтобы объект управлял переменной в своем собственном потоке. И моя программа делает это:

Module Program
    Dim myBool As Boolean = false

    Sub Main(args As String())
        Dim tC As New TestClass(myBool)
        'Opens a parallel thread in which the object does things
        'and should change "myBool" to true when the object is terminated
    End Sub
End Module

Чего я не понимаю, так это того, что я объявляю логическую переменную. Затем я хочу, чтобы другая переменная в моем классе сохранила ссылку на эту переменную (которая была введена в ctor). В boolRef = inBoolRef я обрабатываю boolRef, как если бы это была реальная ссылка. Но в boolRef = true в changeBool() кажется, что это уже не ссылка.

Этот вопрос показывает мне, что это возможно в VB. Net и также работает, по крайней мере, с объектами. Но я не могу присвоить другие значения myBool с помощью другого экземпляра объекта, который должен хранить ссылку на переменную. Я имею в виду, что теоретически я мог бы сделать что-то в классе, как

Public Sub changeBool()
    boolRef.doSomethingLikeAssignAValue()
End Sub

, но это не сработает, потому что, насколько я знаю, Boolean является примитивным типом данных, и поэтому не может быть изменено любым Sub с.

Я из мира C (++) и нахожу его более интуитивным в том, как обрабатывать ссылки, указатели и т. д. c.


TL; DR:

Что я не хочу делать, так это в основном (в C (++)):

Class BoolChanger
{
Private:
    bool *boolRef = nullptr;

Public:
    inline BoolChanger(bool *inBoolRef)
    {
        boolRef = inBoolRef;
    }

    inline void change()
    {
        *boolRef = true; // Change value of pointed-to boolean variable
    }
}

int main(int argc, char *argv[])
{
    bool myBool = false;

    // Open parallel thread in which the object runs an does its things
    BoolChanger bc(&myBool);
    // ... and when it's done, it should set myBool to "true"

    return 0;
}

но в VB. Net. Пожалуйста, кто-нибудь может мне помочь? Кажется, мне не хватает чего-то, что важно знать ...

1 Ответ

1 голос
/ 22 февраля 2020

Вы можете просто передать параметр методу напрямую вместо , пытаясь присвоить его логическому значению. Как это:

Public Class TestClass
    Private boolRef As Boolean

    Public Sub New()   
    End Sub

    Public Sub changeBool(ByRef inBoolRef As Boolean)
        inBoolRef = true
    End Sub

End Class

Тогда используйте мне это нравится

Module Program
    Dim myBool As Boolean = false

    Sub Main(args As String())
        Dim tC As New TestClass
        tC.changeBool(myBool)
    End Sub
End Module

Я не знаю, была ли причина, по которой вы не делали этого раньше. Пожалуйста, дайте мне знать, если ваша программа не поддерживает этот способ:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...