質問

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

役に立ちましたか?

解決

静的メソッドとインスタンスメソッド
C#の 10.2.5静的およびインスタンスメンバー言語仕様は違いを説明します。一般に、静的メソッドはインスタンスメソッドに比べて非常に小さなパフォーマンス強化を提供できますが、やや極端な状況でのみです(この回答を参照)詳細についてはこちらをご覧ください)。

FxCopまたはコード分析状態のルールCA1822:

  

" [メンバーを静的としてマーク]した後、コンパイラはこれらのメンバーに非仮想呼び出しサイトを発行します。   現在のオブジェクトポインタが   非ヌル。これにより、測定可能なパフォーマンスの向上が得られます。   パフォーマンスに敏感なコード。場合によっては、   現在のオブジェクトインスタンスは正確性の問題を表します。"

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

他のヒント

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

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

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

概念的に同じように密接に関連付けられている別のクラスで共有する場合を除き、必ずしも別のクラスに移動する必要はありません。

これはあなたのケースでは発生していないと思いますが、「悪臭」が1つあります。私は、多くの静的メソッドの使用を維持することで苦労しなければならなかったいくつかのコードを見てきました。

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

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

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

これは興味深い読み物です:

http://thecuttingledge.com/?p=57

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

しかし、ここに再シャーパーの文書があります: http://confluence.jetbrains.net/display/ReSharper/Member + can + be + made + static

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

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

パフォーマンス引数は、極端な状況を除いて良いものではありません。実際に行われているのは、1つの追加パラメーター( this )がインスタンスメソッドのスタックにプッシュされることだけです。

クラス内の複雑なロジックの場合、インスタンスインプットがメソッドシグネチャで明確に定義され、インスタンスの副作用が発生しない、孤立したロジックの作成にプライベートスタティックメソッドが役立つことがわかりました。すべての出力は、戻り値またはout / refパラメーター経由でなければなりません。複雑なロジックを副作用のないコードブロックに分解すると、コードの可読性と開発チームの信頼性が向上します。

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

ReSharperはロジックをチェックしません。メソッドがインスタンスメンバーを使用するかどうかのみをチェックします。 メソッドがプライベートで、インスタンスメソッド(1つだけ)によってのみ呼び出される場合、これはインスタンスメソッドを許可するためのサインです。

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

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

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

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

using static className; 

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

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

ジョーイ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top