2009-05-17 14 views
6

静的メソッドおよびインスタンスメソッドと呼ばれる2つのタイプのメソッドとその違いがあります。 しかし、私はまだ別のものの利点を理解できませんでした。何が良いですか?静的メソッドまたはインスタンスメソッド

時々私は静的メソッドが100%オブジェクト指向ではないと感じます。

この2つの間にパフォーマンスの違いはありますか。

誰かが助けることができますか?

答えて

2

インスタンスメソッドでは、staticメソッドよりもわずかに遅くなる暗黙のパラメータ(参照)を渡す必要があります。しかし、それは本当にそれらを好む理由であってはなりません。私は部分的にC#の遺産をもとに推測している

Should C# methods that *can* be static be static?

+1

速度の引数は、非常に遅いプラットフォームまたは何百秒もの時間帯で何かを1秒間に実行しようとしている場合のみ考慮する必要があります。私の推測では、> 2 GHzのデュアルコアプロセッサで作業していると思います。メンバ関数呼び出しと静的関数呼び出しとの間の速度差は、設計基準であってはならない。 –

+1

ええ、はるかに低速なプラットフォームであっても、(私が答えて言ったように)設計上の考慮すべきではありません。パフォーマンスの違いは、具体的に尋ねられたので、私はちょうどそれに注目した –

1

が、私はそれが他のオブジェクト指向言語と同じだ疑い:

関連する議論については、見てください。

スタティックメソッドでは、オブジェクトを処理する必要はありません。良い例は次のようなものです:

Double pi = Math.PI. 

インスタンスメソッドにはオブジェクトが必要です。例は次の行に沿っています:

Integer x = 9; 
Integer y = x.sqrt(); 

クラスに属するすべての情報が、そのクラスにアクセスするためにインスタンス化されたオブジェクトを必要とする必要はありません。オブジェクトの作成に使用できる定数(Math.PIWindow.OVERLAPPEDなど)はすべて、この例です。

2

メソッドで非静的データメンバーを使用する場合は、静的にしないでください(「できません」)。

メソッドで静的でないデータメンバを使用しない場合は、静的にすることができますが、非スタティックメンバを使用するかどうかによってデザインに左右されます。とにかくMehrdadは言った)。

静的でないデータメンバーがクラスにない場合は、すべてのメソッドを静的にすることをお勧めします(順序を整えるために、ヘルパー関数を1つのクラスの下にグループ化する場合など)。

6

完璧なOO世界では、静的メソッドが必要ではないでしょう(私はエッフェルもそれらを持っていないと思います)。しかし、重要なことは、あなたのコードのオブジェクト指向の純粋さではない(C#には、例えば拡張メソッドのような厳密に純粋なオブジェクト指向ではないコンセプトがあります)。

一般的なヘルパーメソッド(それ自体で一般的なヘルパークラスや状態を必要としない)や、Color.FromARGB()などの値型の場合と少し似たように動作する静的メソッドを使用できます。

一般に、オブジェクトの状態に触れない(したがってオブジェクト固有のものよりもクラス固有の)メソッドは、静的にすることができます。パフォーマンスの違いは実際には発生しません。いずれにしても、あまり測定できません。 Jan Grayの偉大な記事Writing faster managed code: Know what things costには注意が必要ですが、これに関するいくつかのハードなデータがあります。

+2

「純粋なOOの世界」であっても、Math.Cosをインスタンスメソッドにすることは、「より多くのOO」になることはありません。このようなユーティリティメソッドの場合、N個のパラメータを持つ静的メソッドを持つか、N-1パラメータを持つインスタンスメソッドを持つことに概念的な違いはありません。 "this"は最初のパラメータ( "Math.Cos(double)" VS "double.Cos()")。 – Trillian

4

静的メソッドの有用性は、主にオブジェクトをインスタンス化せずにメソッドを呼び出す必要がある場合に発生します。たとえば、実際に既存のインスタンスを検索して返す静的メソッドがあります(この例は、シングルトンインスタンスです)。

他の人が述べているように、状態にアクセスしないと、静的なメソッドを静的にすることができ、パフォーマンスが少し向上します。

実際に特定のインスタンスのメソッドを呼び出して、多態性(つまり、派生クラスでメソッドの動作をオーバーライドできる)を得るには、インスタンスメソッドにする必要があります。

クラスがインターフェイスを実装する場合、それらのインターフェイスに属するメソッドもインスタンスメソッドとして宣言する必要があります。

3

インスタンスメソッドはインスタンスに対してタイトです。したがって、静的メソッドの利点の1つがインスタンスにタイトではないことがわかります。静的メソッドは、他のオブジェクトがその問題を解決するために(可視であれば)使用できます。時にはこれは良いと必要です。次に、静的メソッドを同じクラスに保つことについて考えなければなりません。あるいは、より広範な用途のためにユーティリティクラスを構築することを開始する必要があります。 静的メソッドの使用が「less OO」になることはありません。静的メソッドはOOの欠点を回避するための1つの方法です(特に単一継承言語で)。あなたはそれをより機能的なアプローチと呼ぶことができます(私はそれが本当ではないことを知っています)。

これを行うことは、コードを尋ねて、それがインスタンスメソッド、同じクラスの静的メソッド、または別のクラスの静的メソッドであるかどうかを判断する必要があります。

私はパフォーマンスの問題については考えません。それはあなたのデザインを弱めるでしょうし、その違いはそれほど大きなものではありません。パフォーマンスに問題がある場合は、パフォーマンスが重要です。

1

誰も他より優れていません。それは本当にあなたの要件に依存します。クラスメソッドは、クラス全体に変更を適用する場合に呼び出されます。インスタンスメソッドは、クラスに変更を適用せず、そのクラスの一意のインスタンス(オブジェクト)に適用されるときに呼び出されます。

だから私は、なぜ他のものより優れているべきなのかはわかりません。

関連する問題