2
using System;

public delegate void Printer(string s);

class Program
{
    public static void Main(string[] args)
    {
        Printer p = new Printer(delegate {});
        p+= myPrint;
        p("Hello");
        Console.ReadKey(true);
    }

    public static void myPrint(string s)
    {
        System.Console.WriteLine(s);
    }
}

+=後で使用できるように、空の無名関数でデリゲートを初期化する必要があるようです。new句を省略すると、動作pするようになりnull+=動作しなくなります。これは理にかなっています。

これで、デリゲートインスタンスを持つクラスがある場合、次のことができます。

using System;

public delegate void Printer(string s);

class Program
{
    public static void Main(string[] args)
    {
        A a = new A();
        a.p += myPrint;
        a.p("Hello");
        Console.ReadKey(true);
    }

    public static void myPrint(string s)
    {
        System.Console.WriteLine(s);
    }
}


class A {
    public Printer p;
}

なぜこれが許可されるのですか?デリゲートインスタンスのデフォルト値はありますpか?その場合null、を使用して新しいコールバックを割り当てることができないため、それはできません+=。キーワードでこの問題を検索しようとしましたが、"default value for delegates"何も見つかりませんでした。また、質問が基本的すぎる場合は申し訳ありません。

ご協力いただきありがとうございます!

4

1 に答える 1

6

デリゲートは参照型であるため、デフォルト値はですnull

ただし、変数(フィールドとは異なり)はデフォルトでは初期化されません。

Printer p;
p += myPrint; // doesn't work: uninitialized variable

変数を使用する前に、変数を初期化する必要があります。

Printer p = null;
p += myPrint;

また

Printer p;
p = null;
p += myPrint;

デリゲートの場合(イベントではありません!)に注意してください

p += myPrint;

の省略形です

p = (Printer)Delegate.Combine(p, new Printer(myPrint));
于 2012-05-22T22:11:20.410 に答える