18

したがって、値を別の値に変更するこのモック拡張メソッドがあります。

public static void ChangeValue(this int value, int valueToChange)
{
    value = valueToChange;
}

使ってみると:

int asd = 8;
asd.ChangeValue(10);
Debug.Log(asd);

10 ではなく 8 を返します。値は ChangeValue メソッド内で変更されましたが、「asd」の値は変更されませんでした。「asd」を更新するには、メソッドに何を追加する必要がありますか?

4

6 に答える 6

12

return値またはパラメーターを使用せずにそれを行うことはできませんref。後者は(拡張メソッド)と一緒には機能しないthisため、最善の策はreturn(ではなくvoid)値です。

于 2013-01-15T07:54:39.193 に答える
11

新しいC#バージョンがサポートしているため、古い答えはもう有効ではありませんthis ref。詳細については、この回答を参照してください。

古い答え:

intですstructので、value-typeです。これは、参照ではなく値で渡されることを意味します。クラスはreference-typesあり、参照によって渡されるため、動作が異なります。

オプションは、次のような静的メソッドを作成することです。

public static void ChangeValue(ref int value, int valueToChange)
{
    value = valueToChange;
}

そしてそれを使用します:

int a = 10;
ChangeValue(ref a, 15);
于 2013-01-15T07:54:53.457 に答える
1

この回答によると: https://stackoverflow.com/a/1259307/1945651、C#でこれを行う方法はありません。のようなプリミティブ型は不変であり、 or修飾子intなしでは変更できませんが、構文はor here を許可しません。outrefoutref

元の値を変更しようとするのではなく、拡張メソッドが変更された値を返すようにするのが最善のケースだと思います。

どうやらこれは VB.NET で可能であり、絶対に必要な場合は、VB.NET アセンブリで拡張メソッドを定義することもできますが、そもそもそれはおそらくあまり良い方法ではありません。

于 2013-01-15T07:56:09.503 に答える
0

int 値型なので、関数内で渡すと値でコピーされます

関数の外側の変更を確認するには、次のように書き換えます。

public static int ChangeValue(this int value, int valueToChange)
{
    //DO SOMETHING ;

    return _value_; //RETURN COMPUTED VALUE 
}

ref keyowrdを使用して行うことは可能ですが、を使用してパラメーターに適用することはできないthisため、この場合は結果の値を返すだけです。

于 2013-01-15T07:55:31.337 に答える