8

次のようなものがあるとします。

public IOrder SomeMethodOnAnOrderClass()
{
   IOrder myOrder = null;

   if (SomeOtherOrder != null)
   {
       myOrder = SomeOtherOrder.MethodThatCreatesACopy();        
   }

   return myOrder;
}

C# の作成者が to の明示的なセットを要求したのはなぜmyOrderですかnull?

未割り当てのままにしたい場合はありますか?

null への設定に関連するコストはありますか? 割り当てられていない変数を常にnullに設定したくないですか?(後で別の値に設定されたとしても。)

それとも、「すべての i をドットで囲み、すべての t を交差させた」ことを確認する必要がありますか?

それとも他に何か理由があるのでしょうか?

4

2 に答える 2

10

それらデフォルトでnull、より正確には、オブジェクトは によって返される値にデフォルト設定されますがdefault(T)、これは値の型によって異なります。

これが特徴です。プログラマーが初期化されていない変数を使用することによって引き起こされる、あらゆる種類のバグが実際に発生しています。すべての言語が、この種のことに対してそのように明確に定義された動作を提供するわけではありません (あなたは自分が誰であるかを知っています...)。

どうやらあなたはまだそれを経験していないようです。コンパイラがより良いコードを書くのに役立っていることを喜んで受け入れてください。

于 2013-01-23T00:06:21.597 に答える
6

到達不能ステートメントでローカル変数が確実に割り当てられるのはなぜですか? (リンクを提供してくれた MiMo に感謝) Eric Lippert さんのコメント:

これを違法にしたい理由は、多くの人が信じているように、ローカル変数がガベージに初期化され、ガベージからユーザーを保護したいからではありません。実際、ローカルをデフォルト値に自動的に初期化します。(C および C++ プログラミング言語はそうではありませんが、初期化されていないローカルからガベージを読み取ることを喜んで許可します。) むしろ、そのようなコード パスの存在はおそらくバグであり、私たちはあなたを投げたいと思っているからです。品質のピット; そのバグを書くために一生懸命働かなければならないはずです。

私がこれを理解している限り、ローカル変数に値が割り当てられていない場合、開発者が実際にdefault(T)読み取り中に取得したかったという意味ではありません。これは、(ほとんどの場合) 開発者がおそらくそれを見逃し、初期化を忘れたことを意味します。default(T)これはむしろバグであり、開発者がローカル変数を宣言するだけで意識的に初期化したい場合の状況です。

于 2013-01-23T00:25:19.793 に答える