2011-07-13 15 views
3

整数を作成していましたが、作業する前に0でインスタンス化したかったのです。int i = 0とint i = default(int)の間にパフォーマンスの違いはありますか?

私はその後、私は私の選択がミニミニ性能が最善であるかどうかを知りたい

int i = 0; 

ある他のものと交換することを取り除いまず

int i = default(int); 

書きました。 default()関数はコンパイル時に命令を増加させますか?

+2

おそらく 'int i;'はさらに優れた性能を発揮するでしょうか?私はそのような質問は尋ねる価値がないと確信しています。それは言語コンパイラに侮辱のように私に聞こえる – driushkin

+1

そして、マイクロ最適化を超えて、常にナノ最適化が... –

答えて

9

いいえ、コンパイル時に解決され、同じILを生成します。値のタイプは0(ブールがある場合はfalseですが、それでも0です)、参照タイプはnullです。

+0

それは一般的に正しいですか?もし私が 'public T GetDefault (){return default(T);}のようなジェネリックメソッドを持っていたらどうなりますか? } ' - コンパイル時には解決できません。実際、まだ存在しないタイプでも使うことができます。とにかく、本当の答えは - このばかげた小さな変更があなたのために違いを生むならば、C#はおそらくあなたのニーズには遅すぎるでしょう。 – Kobi

+2

これは 'T'が知られている/推定されるので、コンパイル時に解決できます。 –

+1

@ George - それは興味深いケースではありません。'GetDefault'をコンパイルされたアセンブリの一部として使うとどうなりますか? 'default(T)'はコンパイルされていないか、その場合最適化されていません。(OK、それはJITですが、別の質問です) – Kobi

3

Marlonの答えは技術的には正確ですが、各オプション間に明確な意味の違いがあるはずです。あなたは、整数の数学的な操作をしたいとき文字通りゼロに初期化

int i = 0; 

はセマンティック理にかなって、その操作は、変数がゼロの特定の値であることから始める必要があります。良い例は、インデックスカウンタ変数を作成することです。 0から始まりカウントアップしたいと考えています。あなたがいるときにそのdefault値に変数を設定する

int i = default(int); 

は、変数を手動プロセスの後半で設定されます知っている変数は言ってクラスを作成、たとえば、理にかなっています。ここでは一例です(ただし非現実的なことであってもよい):

class IntegerClass 
{ 
    private int value; 

    public IntegerClass(int value) 
    { 
     this.value = value; 
    } 

    public void Reset() 
    { 
     this.value = default(int); 
    } 
} 

は再び、彼らは技術的に等しい(実際には、同一のCILにコンパイルされます)が、それぞれが異なるセマンティックな意味を提供しています。

また、defaultを使用すると、ジェネリックを使用するときに変数を初期化する必要があります。それはようになります

public T SomeOperation<T>() 
{ 
    T value = default(T); 

    this.SomeOtherOperation(ref value); 

    return T; 
} 
1

唯一の本当の違いは、コンパイル時であるので、私はそれはしかし、あなたは、デバッグを押したときに、他よりもミリミリミリミリ秒速く一つの方法であるか、またはコンパイルうとしすぐにコンパイルされると、まったく同じようになります。

これらの小さな変更は、実際のプログラミング時間にのみ影響します。したがって、より広い意味では、デフォルト(int)の書き込みは0の書き込みよりも遅く、あなたが思った時間はさらに長くかかった。

関連する問題