1

C#リファレンスによると

「null キーワードは、オブジェクトを参照しない null 参照を表すリテラルです。null は参照型変数のデフォルト値です」


次のアプリ コードのコメントe=null行 (記事「C# でのイベントとデリゲートの違い」から抜粋) でコンパイル エラーが発生 することに驚きました。

Use of unassigned local variable 'e'

コメントせずにコンパイルして実行します。

分からない:

  • 変数はどこでe使用されますか?
  • 愚か者が変数をに割り当てずにアプリを強制的に実行することは可能nullですか?

using System;   
class Program   
{   
  static void Main(string[] args)   
  {   
    DelegatesAndEvents obj = new DelegatesAndEvents();   
    obj.Execute();  
  }  
}  
public class DelegatesAndEvents  
{
  public event EventHandler MyEvent;
  internal void Execute()
  {
    EventArgs e;
//Commenting the next line results in compilation error
//Error 1   Use of unassigned local variable 'e'
    e = null;
    int sender = 15;
    MyEvent += MyMethod;
    MyEvent += MyMethod2;
    MyEvent(sender, e);
  }
  void MyMethod(object sender, EventArgs e)
  {
    Console.WriteLine(sender);
  }
  void MyMethod2(object sender, EventArgs e)
  {
    Console.WriteLine(sender);
    Console.ReadLine();
  }
}

更新(またはすべての回答へのコメント):
だから、私はそれを知らなかった、一種のヌルがあります-割り当てられているものと割り当てられていないもの...面白い...

チェックのために、おそらく異なるタイプを持つ必要があり
ます。
typeof(assigned_null) の場合は、それを行います。

4

4 に答える 4

2

ローカル変数はデフォルト値で初期化されませんが、フィールドは初期化されます。

于 2013-02-14T13:40:08.363 に答える
1

Executeどのイベント ハンドラーが に登録されているかをコンパイルするときに、コンパイラーが知る方法はありませんMyEventExecute(その他はが呼び出される前に既に登録されている可能性があり、それらは を使用しようとする可能性がありますe)。そのため、登録されていることがわかっているハンドラーの分析は試みません。したがって、 を渡したいので、e初期化する必要があります。

に合格したいのにnull、なぜ紹介eするのですか?ただ持っている

MyEvent(sender, null);

少なくともあなたの意図を明確にします。

于 2013-02-14T13:48:24.697 に答える
1

e値を割り当てずに使用しています。を使用して、 null も値であるe = null;ため、変数 e に値を割り当てています。

また、参照型のC#参照のデフォルト値によると、nullですが、ここeでは変数です。変数はデフォルト設定されていないため、使用する前に「明確な代入」が必要です。

于 2013-02-14T13:54:55.883 に答える
1

質問に答えるには:

  • 質問: 変数 e はどこで使用されますか?

回答: MyEvent(sender, e );に渡す場所で使用されます。

  • 質問: 愚か者が変数を null に割り当てずに、アプリを強制的に実行することは可能ですか?

回答: いいえ、 eを別のメソッドに渡して使用しているため、愚かではありません。直接使用していないだけですが、まだ使用しています。

実際には、どこでもeを宣言する必要はありません。null を MyEvent に直接渡すことができます。

MyEvent(sender, null);

その後、冗長な変数宣言を行う必要はありません。

于 2013-02-14T13:46:58.910 に答える