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);
}
}
Run Code Online (Sandbox Code Playgroud)
好像我必须使用空的匿名函数初始化一个委托才能+=以后使用.当我省略该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;
}
Run Code Online (Sandbox Code Playgroud)
为什么允许这样做?委托实例是否有默认值p?它不可能是null因为那时我无法使用它为其分配新的回调+=.我试图用关键字搜索这个问题,"default value for delegates"一无所获.对不起,如果问题太基本了.
谢谢你的帮助!
委托是引用类型,因此默认值为null.
但是,默认情况下不会初始化变量(与字段不同):
Printer p;
p += myPrint; // doesn't work: uninitialized variable
Run Code Online (Sandbox Code Playgroud)
您需要先初始化变量,然后才能使用它:
Printer p = null;
p += myPrint;
Run Code Online (Sandbox Code Playgroud)
要么
Printer p;
p = null;
p += myPrint;
Run Code Online (Sandbox Code Playgroud)
请注意,对于代表(但不是事件!)
p += myPrint;
Run Code Online (Sandbox Code Playgroud)
是简写
p = (Printer)Delegate.Combine(p, new Printer(myPrint));
Run Code Online (Sandbox Code Playgroud)