2013-05-03 7 views
6

これは愚かな質問かもしれません。私はコンパイラが未使用の地元住民を取り除くことを知っています。私はこのように私のコードを書くなら:プロパティが割り当てられている場合、C#コンパイラは未使用のローカルを削除しますか?

class MyClass 
{ 
    public int SomeProperty 
    { 
     get 
     { 
      ... 
     } 
    } 

    public void SomeFunction() 
    { 
     //will this line be removed if i is never used? 
     int i = SomeProperty; 
     ... 
    } 
} 

私は疑問に思ってiがあるため、最適化のコンパイラによって削除される場合に。実行したいSomePropertyのゲッターの中にロジックがあります。 iが削除される場合は、SomePropertyを関数に変更する必要があります。

Btwは、どのラインがコンパイラによって最適化されるのかを知る方法はありますか?

+0

あなたは大丈夫でしょう!コンパイラそれは知っているほどスマートです – Charleh

+15

私はコンパイラが何をすることが重要ではないことを示唆しています。これは悪いデザインです。ゲッターを呼び出すことが重要な副作用を持っている場合、ゲッターではないはずです。ゲッターはおそらく怠惰な初期化をしているはずですが、これが重要ではありません。なぜなら、それが起こらなければ、それを得るためには次のことで済むからです。私はあなたが何をしているのか分からないが、おそらくその時点で明示的に呼び出すことができる独自のメソッドにリファクタリングする必要があります。他の誰もコードを見ている誰かが無意味な割り当てとしてそれをリファクタリングするかもしれません... – Chris

+2

関連:http://stackoverflow.com/a/2162893/284240 "** C#コンパイラはこの種の最適化を決してしません** ;そうすることで、コンパイラが呼び出されているコードにコンパイラのピアを呼び出し、それが計算した結果が呼び出し先のコードの寿命にわたって変化しないことを確認する必要があります。可能性があります。** " –

答えて

9

私は、コンパイラが行うことは重要ではないことを示唆しています。これは悪いデザインです。

ゲッターを呼び出す場合、重要な副作用がある場合は、おそらくゲッターではないはずです。ゲッターはおそらく怠惰な初期化をしているはずですが、これが重要ではありません。なぜなら、それが起こらなければ、それを得るためには次のことで済むからです。

あなたは何をしているのか分かりませんが、おそらくその時点で明示的に呼び出せる独自のメソッドにリファクタリングする必要があります。

その他の主な懸念事項は、可読性です。 iが再度使用されることがない場合には、int i = SomeProperty;という行を見る人は、その行が無意味であると判断し、何もしないので、予期しないエラーが発生した場合にコードから取り除きます。あなたはLogicExtractedFromProperty()のようなメソッドを呼び出すほうがよいでしょう。あなたが何かをしているのは明らかです。

コンパイラは正しいことをしているかもしれませんが(わからない、気にしないかもしれませんが)、そうでない人もいます。

+0

+1:あなたの2セントのため –

+0

おかげでみんな!私のソフトウェアで見たコードです。ちょうどそれが実際に働くかどうか不思議です:) – Xinchao

+1

そのプロパティのゲッターがレイジー .Valueの場合はどうなりますか?私はそのデザインを変更することはできません。最初の考えは、私がLazyをすぐに使う必要がある場合、Lazyを使用しないことですが、それは部分的なケースに過ぎず、必ずしも必要ではありません。しかし、ある時点で私はValueをプリロードし、初期化されたLazy オブジェクトを返す必要があります。それは危険で、将来のバージョンのコンパイラでは変更されるかもしれませんか? –

関連する問題