2011-12-27 7 views
3
static int _i; 
    static void Display() 
    { 
     //operates on _i; 
    } 

関数が静的であると宣言されている場合や、その中のフィールドが静的である場合に静的でない場合は、何らかの違いが生じますか?

方法の静的非静的ネスの問題について特異的であるシナリオです
static int _i; 
    void Display() 
    { 
     //operates on _i; 
    } 

編集;注:この質問は、多くの人が答えているように、静的メソッドと非静的メソッドの違いについてではありません。問題は、相違点を気にしなければならないシナリオ/ユースケースです。明確にするために、@ ziesemerの答えを見てください。

+1

変数と関数の関係は何ですか? –

+0

はい、違いがあります。 – phoog

+0

@HenkHolterman希望私は編集で明確です – nawfal

答えて

2

非静的関数を使用すると、関数を含むクラスのサブクラスを作成し、1つまたは複数のメソッドに対してオーバーライドされたメソッドを提供し、拡張性とカスタマイズのオプションを提供できます。これは非静的関数では機能しません。一方、非静的関数では、その関数を呼び出す前にクラスのインスタンスを最初に作成する必要があります。

なぜすべての静的変数があるのか​​を再考し、すべてを静的変数にするのではなく、静的変数をすべて静的変数にすることをお勧めします。これにより、同じランタイム内の複数の独立したインスタンスをすべて持つことができます。変数を静的にすることで、すべての人が同じ構成(または変数が格納されているもの)を使用するようになります。

+2

静的関数もパフォーマンスが向上し、検索に必要な検索回数が少なくて済みます。しかし、そのパフォーマンスの向上はほとんど決して重要ではありません。 –

+0

@ziesmer最初の部分は良い答えです。私は2番目の部分を認識していますが、クラスのための静的フィールドを必要とする場合もあります。 – nawfal

6

インスタンスの(非静的な)バージョンは、thisという「隠し」パラメータで実装されています。静的フィールドへのアクセスには使用されないので、ここで静的メソッドを使用する方が少し経済的です。

一般的な推奨事項は次のとおりです。メソッドが静的である場合は静的にすることができます。しかしそれは、パフォーマンスよりも明確な意図を示すことです。

+0

//それはパフォーマンスよりもはっきりした意図を示しています。 nice one .. – nawfal

0

非静的メソッドがクラスに対して呼び出されると、そのオブジェクトが目に見えない最初のパラメータ "this"として渡され、値渡しされます。構造体に対して非静的メソッドが呼び出されると、参照によって渡される目に見えない最初のパラメータ "this"が与えられます。呼び出し側は多くの場合、関数が実際にパラメータを使用するかどうかを知る方法がないため、関数が実際に関数を使用するかどうかに関わらず、パラメータは渡されます。この関数は、呼び出し元が "this"を渡すことを期待しなければならず、関数が使用されないことに気付かないため、関数が "this"を使用しない場合、最初に渡されたパラメータを無視する必要があります。したがって、たとえ呼び出し側が関数が "this"を使用しないことを知っていたとしても、関数が無視するために余分なパラメータを渡す必要があります。

関連する問題