2

Foo8 ~ 16 バイトの構造体があるとします。別の構造体へのすべての値への静的メソッドがAdd()あり、パフォーマンスが最も重要です。以下のような多くの静的メソッドを見てきました。

public static Foo Add(Foo fooA, Foo fooB)
{
    var newVar = fooA.Var + fooB.Var
    return new Foo(newVar);
}

引数を参照するだけで高速化できることを測定しました:

public static Foo Add(ref Foo fooA, ref Foo fooB)
{
    var newVar = fooA.Var + fooB.Var;
    return new Foo(newVar);
}

けっこうだ。しかし、新しいインスタンスを作成せずに最初の引数を変更すると混乱するでしょうか?

public static void Add(ref Foo fooA, ref Foo fooB)
{
    fooA.Var += fooB.Var;
}

質問をうまく表現できていませんが、理解していただければ幸いです。

編集:または、おそらく、このようなものが必要な場合、メソッドは最初から静的であってはなりません。それは正しい主張ですか?

4

2 に答える 2

1

混乱することはありませんが、異なる結果が得られます。2 番目のケースでは、入力の 1 つを変更していますが、おそらくそれは望ましくありません。

この動作は副作用と呼ばれ、時には本当に苦痛です。これは、命令型言語の代わりに関数型プログラミング (副作用の少ない) を使用する正当な理由です。

于 2013-08-05T13:47:08.463 に答える
0

2番目の例は、.netフレームワークが「byval」の場合のようにパラメーターをコピーしないため、間違いなく高速になります。この手法は、あらゆる種類のパフォーマンスの向上が必要な場合に使用されます。「byref」が「byval」よりも高速であることは明らかです。

メソッドは静的またはインスタンスにすることができます。「ref」を使用する場合、メモリのコピーはありません。この場合、値型である構造体です。

于 2013-08-05T13:57:38.880 に答える