402

ReSharper は、静的にすることができる ASP.NET ページごとに複数の関数を指摘するのが好きです。それらを静的にすると役立ちますか?それらを静的にしてユーティリティクラスに移動する必要がありますか?

4

14 に答える 14

278

私の見解では、パフォーマンス、名前空間の汚染などはすべて二次的なものです。何が論理的かを自問してください。メソッドは型のインスタンスに対して論理的に動作しているか、それとも型自体に関連しているか? 後者の場合は、静的メソッドにします。自分の制御下にない型に関連している場合にのみ、ユーティリティ クラスに移動します。

インスタンスに対して論理的に作用するが、たまたまインスタンスの状態をまだ使用していないメソッドがある場合があります。たとえば、ファイル システムを構築していて、ディレクトリの概念を理解していても、まだ実装していない場合、ファイル システム オブジェクトの種類を返すプロパティを作成できます。 「ファイル」 - ただし、論理的にはインスタンスに関連しているため、インスタンス メソッドである必要があります。これは、メソッドを仮想化する場合にも重要です。特定の実装では状態が必要ない場合がありますが、派生クラスでは必要になる場合があります。(たとえば、コレクションが読み取り専用であるかどうかを確認します。そのコレクションの読み取り専用形式をまだ実装していない可能性がありますが、それは明らかにコレクション自体のプロパティであり、型ではありません。)

于 2008-10-04T06:34:03.180 に答える
267

静的メソッドとインスタンス メソッドの比較 C# 言語仕様の
静的メンバーとインスタンス メンバーでは、違いが説明されています。一般に、静的メソッドはインスタンス メソッドよりもわずかにパフォーマンスを向上させることができますが、それはやや極端な状況でのみです (詳細については、この回答を参照してください)。

FxCop またはコード分析の規則 CA1822 は次のように述べています。

「[メンバーを静的としてマーク] した後、コンパイラはこれらのメンバーに非仮想呼び出しサイトを発行し、現在のオブジェクト ポインターが null でないことを確認する各呼び出しの実行時のチェックを防ぎます。これにより、測定可能なパフォーマンスが向上する可能性があります。パフォーマンスが重要なコードの場合。場合によっては、現在のオブジェクト インスタンスへのアクセスの失敗が正確性の問題を表しています。」

ユーティリティ クラス
設計上意味がない限り、それらをユーティリティ クラスに移動しないでください。メソッドが角度を表すクラスに関連するように、静的メソッドが特定の型に関連する場合、ToRadians(double degrees)そのメソッドがその型の静的メンバーとして存在することは理にかなっています (これはデモンストレーションのための複雑な例であることに注意してください)。

于 2008-10-04T00:12:50.767 に答える
61

メソッドをクラス内としてマークするstaticと、インスタンスメンバーを使用していないことが明らかになります。これは、コードをざっと読むときに知っておくと役立ちます。

概念的に同じように密接に関連している別のクラスによって共有されることを意図していない限り、必ずしも別のクラスに移動する必要はありません。

于 2008-10-04T01:04:09.587 に答える
22

これはあなたのケースでは起こらないと確信していますが、いくつかのコードで見た「悪臭」の1つは、多くの静的メソッドを使用し続けることで苦しむ必要がありました。

残念ながら、それらは特定のアプリケーション状態を想定した静的メソッドでした。(確かに、アプリケーションごとに1人のユーザーしかいません!静的変数でUserクラスにそれを追跡させないのはなぜですか?)これらはグローバル変数にアクセスするための栄光の方法でした。また、静的コンストラクター(!)もありましたが、これはほとんどの場合悪い考えです。(私はいくつかの合理的な例外があることを知っています)。

ただし、静的メソッドは、オブジェクトのインスタンスの状態に実際には依存しないドメインロジックを除外する場合に非常に役立ちます。それらはあなたのコードをもっと読みやすくすることができます。

それらを正しい場所に配置していることを確認してください。静的メソッドは他のオブジェクトの内部状態を煩わしく操作していますか?代わりに、それらの動作がそれらのクラスの1つに属しているという良いケースを作ることができますか?関心の分離を適切に行わないと、後で頭痛の種になる可能性があります。

于 2008-10-04T00:29:01.047 に答える
13

これは興味深い読み物です:
http://thecuttingledge.com/?p=57

ReSharper は、メソッドを静的にすることを実際に提案しているわけではありません。たとえば、署名に表示されるクラスの1つではなく、そのメソッドがそのクラスにある理由を自問する必要があります...

しかし、ReSharperのドキュメントは次のとおりです: http://confluence.jetbrains.net/display/ReSharper/Member+can+be+made+static

于 2012-06-19T11:33:47.500 に答える
10

@Jason Trueの回答に追加するだけで、メソッドに「静的」を配置するだけでは、メソッドが「純粋」になるとは限らないことを認識することが重要です。宣言されているクラスに関してはステートレスになりますが、状態を持つ他の「静的」オブジェクト (アプリケーション構成など) にアクセスする可能性があります。これは必ずしも悪いことではありませんが、理由の 1 つです。私は個人的に静的メソッドを好む傾向があります。静的メソッドが純粋であれば、周囲の状態を気にすることなく、それらを分離してテストし、推論することができます。

于 2009-09-03T05:52:35.903 に答える
7

クラス内の複雑なロジックの場合、インスタンス入力がメソッド シグネチャで明確に定義され、インスタンスの副作用が発生しない、分離されたロジックを作成するのにプライベートな静的メソッドが役立つことがわかりました。すべての出力は、戻り値または out/ref パラメーターを介して行う必要があります。複雑なロジックを副作用のないコード ブロックに分割することで、コードの読みやすさと開発チームのコードに対する信頼を向上させることができます。

一方で、ユーティリティメソッドの急増によってクラスが汚染される可能性があります。いつものように、論理的な命名、文書化、およびチームのコーディング規則の一貫した適用により、これを軽減できます。

于 2009-10-15T20:44:25.910 に答える
6

特定のシナリオで最も読みやすく、直感的なことを行う必要があります。

this実際に起こっている唯一のことは、1 つの余分なパラメーター ( ) がインスタンス メソッドのスタックにプッシュされていることであるため、最も極端な状況を除いて、パフォーマンスの引数は適切ではありません。

于 2008-10-04T00:05:49.063 に答える
5

ReSharper はロジックをチェックしません。メソッドがインスタンス メンバーを使用するかどうかのみをチェックします。メソッドが非公開で、(おそらく 1 つだけの) インスタンス メソッドによってのみ呼び出される場合、これはそれをインスタンス メソッドにするサインです。

于 2012-02-06T09:27:59.207 に答える
3

メソッドを静的にするということは、最初にそのクラスのインスタンスを作成しなくても、クラスの外部からメソッドを呼び出すことができることを意味します。これは、サードパーティベンダーのオブジェクトまたはアドオンを操作するときに役立ちます。con.Writeline()を呼び出す前に、最初にコンソールオブジェクト「con」を作成する必要がある場合を想像してみてください。

于 2008-10-04T01:08:36.083 に答える
3

関数が多くのページで共有されている場合は、それらを基本ページ クラスに配置し、その機能を使用するすべての asp.net ページにその機能を継承させることもできます (関数も静的にすることができます)。

于 2008-10-04T00:07:50.870 に答える
2

名前空間の汚染を制御するのに役立ちます。

于 2008-10-04T00:04:08.180 に答える
0

ちょうど私のタペンス: すべての共有静的メソッドをユーティリティ クラスに追加すると、次を追加できます。

using static className; 

これにより、コードの入力が速くなり、読みやすくなります。たとえば、継承した一部のコードには、「グローバル変数」と呼ばれるものが多数あります。インスタンス クラスであるクラスでグローバル変数を作成するのではなく、それらすべてをグローバル クラスの静的プロパティとして設定します。散らかったとしても、それは仕事をします。静的名前空間が既に参照されているため、名前でプロパティを参照するだけです。

これが良い習慣かどうかはわかりません。C# 4/5 について学ぶことがたくさんあり、リファクタリングするレガシー コードがたくさんあるので、Roselyn のヒントを参考にしようと思っています。

ジョーイ

于 2016-11-14T16:09:41.413 に答える