0

いくつかのクラスがあり、スイッチに基づいて特定のクラスの特定のインスタンス内でブール値を変更したいのですが、値への「ポインター」を取得できないようです。コピーを取得するだけです。

Class aClass;
Class bClass;
Class cClass;

public class Class
{
    public bool b = true;
    ...
}

void Method(int i)
{
    bool localBool;

    switch(i)
        case 1:
            localBool = aClass.b;
            break;
        case 2:
            localBool = bClass.b;
            break;
        case 3:
            localBool = cClass.b;
            break;

    localBool = false; // This changes the localBool, but not Class.b
}

編集: クラスに 3 つのクラスではなく 3 つのブール値がある場合はどうなりますか?

Class aClass;

public class Class
{
    public bool a = true;
    public bool b = true;
    public bool c = true;
    ...
}

void Method(int i)
{
    bool localBool;

    switch(i)
        case 1:
            localBool = aClass.a;
            break;
        case 2:
            localBool = aClass.b;
            break;
        case 3:
            localBool = aClass.c;
            break;

    localBool = false; // This changes the localBool, but not aClass.Bool
}
4

5 に答える 5

5

私はこのようにします。

void Method(int i)
{
    Class local;

    switch(i)
        case 1:
            local = aClass;
            break;
        case 2:
            local = bClass;
            break;
        case 3:
            local = cClass;
            break;

    local.b = false;
}

ちなみに、C# のポインターはサポートされていますが、使用しないことを強くお勧めします。他に方法がない場合にのみ使用してください。

于 2013-05-24T20:33:35.977 に答える
2

アクセサー ラッパーのアプローチについてはコメントで触れたので、大まかに以下に示します。

編集

void Method(int i)
{
    Action<bool> localBool = null;

    switch(i)
        case 1:
            localBool = v => aClass.b = v;
            break;
        case 2:
            localBool = v => bClass.b = v;
            break;
        case 3:
            localBool = v => cClass.b = v;
            break;

    localBool(false); // This changes the localBool, and Class.b
}
于 2013-05-24T21:00:22.873 に答える
2

unsafeC# では、コンテキスト外のポインターはありません。MyClass mc = new MyClass();クラスは参照型であるため、最も近いものを取得するようなことをすると、C# のポインターになります。私の知る限り、この 2 つは概念的には同じです。C# では、エラーの可能性の多くがランタイム/コンパイラによって取り除かれます。次のようなことをする場合、私の例を続けます。

  MyClass mc2 = mc;

次にmc2、 と同じメモリも参照しますmc。それをさらに進めます。mc2.MyBool = false;次に行った場合if (mc.MyBool)、同じオブジェクトのブール値を変更したばかりなので、条件を満たしていませんでした。この動作は、C++ でポインターとオブジェクトを扱うことに慣れている場合に期待するものとまったく同じです。

于 2013-05-24T20:33:47.087 に答える
0

編集後の問題は、ブール値が型付けされていることです。したがって、値の型を別のインスタンスにコピーすると、参照は取得されず、値のみが取得されます。クラスの値を変更したい場合は、直接変更する必要があります。クラスへの参照があれば、簡単です。

 LocalClass.a = false;
于 2013-05-24T20:44:53.857 に答える
0

.net には、参照型と値型の 2 種類の型が含まれています。クラス、文字列などは参照型です。Int、DateTime、boolean などは値の型です。これらのタイプには多くの違いがあります。あなたの場合、最も重要なのは、値型の値を変数に割り当てると値がコピーされることです。そのため、 localBool は、値を持つ別の独立変数にすぎません。すべての変更によって、クラスの値が変更されるわけではありません。

あなたの場合、スイッチブロックを使用したメソッドの結果としてクラスへの参照を返し、その後ブール値のプロパティを変更することをお勧めします。

于 2013-05-24T20:45:21.513 に答える