6

クラスをインスタンス化して 1 つのメソッドを呼び出すだけでよい場合は、次のように 1 行で実行するのが好きです。

string result = new MyClass().GetResult();

のようなことをする代わりに、

var myClass = new MyClass();
string result = myClass.GetResult();

メモリ割り当てとその後のクリーンアップに関して、同じことが舞台裏で起こっていることを私は理解しています。これは本当にそうですか、それとも違いはありますか?もしそうなら、一方は他方よりも効率的ですか?

編集:

多くの人が提案したように、メソッドを静的にすることは良い解決策です。他の誰かが作成したクラスを使用していますが、現時点ではリファクタリングまたは変更できません。この種の状況では、インラインまたは別の行でインスタンス化することに違いはありますか?

編集:

この質問に対する答えは、クラスが維持するリソースの数によって異なりますか (以下の Blam と BenCr のコメントから)。

4

3 に答える 3

4

実際には、ワンライナーを使用する方が効率的です。これは、ランタイムがガベージ コレクションのために追跡するローカル変数が 1 つ少ないためです。 編集:不正解です。以下の Adam の返信を参照してください。私の元のポイントは依然として有効であり、効果は(もしあれば)無視できるはずです.

しかし、本当の問題は、なぜ GetResult() が静的関数ではないのかということです。これにより、インスタンス化全体が完全に回避されます。

于 2012-12-05T16:18:06.920 に答える
3

C# コーディング規則であなたの質問に関するものは何も見当たりません。

私の個人的な好みは、あなたが挙げた後者の例です。コードの可読性が向上すると思います。

ただし、クラスから単一の値を取得するためだけにクラスをインスタンス化する場合は、そのクラスの設計方法を再考したほうがよいでしょう。GetResult() メソッドはおそらく静的である必要がありますか?

于 2012-12-05T16:18:48.573 に答える
0

これは、クラスが IDisposable を実装している場合にのみ適用されます。
単一のメソッドの効率的な使用を探していて、それで完了している場合は、どちらもありません。
MyClass() は、スコープ外になるまで破棄されません。

using (myClass = new MyClass()) 
{
    string result = myClass.GetResult();
}

using ステートメント (C# リファレンス)

静的メソッドとクラスを検討する

静的クラスと静的クラス メンバー (C# プログラミング ガイド)

ガベージ コレクションは幅広いトピックです。
あなたはそれがあなたのコードではないと述べましたが、ここにリソースを保持するコードを書く場合は、いくつかのガイダンスがあります.

IDisposable インターフェイス

于 2012-12-05T16:16:27.747 に答える