1

まず、コンテキストを提供しましょう。

C# では、メソッドに渡されるオブジェクトは参照によって渡されます。参照は、渡されたオブジェクトがキーワードで再インスタンス化された場合にのみ失われますnew

var obj = Alter(obj)だから、私は(方法1)のようなことをするのが好きです。つまり、オブジェクトを渡してオブジェクトを返します。同等のことを行うのとは対照的に: Alter(obj) (方法 2)参照されるオブジェクトが同じように変更されますが、コピーを返す代わりに参照によって変更されます。命知らずのコーダーが後でコードを変更してキーワード「new」を使用した場合...既存のコードが燃えたり死んだりしないため、最初のコードの方が優れていると私は主張します。

私の質問は、方法 1は方法 2よりも大幅に多くのメモリを使用するか、それとも他のパフォーマンスの低下を引き起こすかということです。つまり、これにより GC がより頻繁に呼び出されますか?

答えはノーだ

4

3 に答える 3

4

C# では、メソッドに渡されるオブジェクトは参照によって渡されます。参照は、渡されたオブジェクトがキーワード new で再インスタンス化された場合にのみ失われます

いいえ、いいえ、少なくともデフォルトではありません。デフォルトでは、すべてが値渡しされます。たまたま、参照型の場合、値渡しされるものが参照です。

したがって、参照のコピーが作成されます。これはまた、2番目のステートメントを反証します。メソッドの引数は好きなように再割り当てできます。コピーを変更しているだけです。これにより、質問の意味も変わります。なぜなら、あなたは続けて...

だから、私は var obj = Alter(obj)(method 1) のようなことをするのが好きです... 命知らずのコーダーが後でキーワード「new」を使用するようにコードを変更した場合...既存のコードが燃えて死ぬことはありません。

そのような状況は発生しません。第二に、完全に機能せず、テストも行わなかったコードをチェックインするプログラマーと一緒に仕事をすると、より大きな問題が発生します。ただし、new参照コピーで「キーワードを使用する」ことは、とにかく無関係です(少なくとも、オリジナルに影響を与えるという点では)。アプローチが正しかったとしても、これは過度に防御的です。

あなたへの私の質問は次のとおりです。単一の入力の状​​態を変更するためだけに機能する関数がある場合、なぜこのメソッドはそもそも型のインスタンス メソッドではないのでしょうか?

于 2012-08-09T03:59:05.377 に答える
3

C# never copies a reference type. If you pass in obj to your method and then return it, that is the same exact object instance you started with.

That does not create additional pressure for the GC.

于 2012-08-09T03:45:42.290 に答える
1

In general, it's safer to not modify parameters that are specified as input to a method. As for performance, memory consumption difference between these two are almost certainly going to be negligible, and definitely won't be the performance bottleneck in your program. It's a case of pre-mature optimization.

You should choose the cleaner, safer solution, unless you have evidence that the performance difference is causing a problem in your program.

于 2012-08-09T03:45:33.147 に答える