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子句时,pgets to be nulland +=doesn't work,这是有道理的。

现在,当我有一个带有委托实例的类时,我可以执行以下操作:

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 回答