实例化并初始化委托
本文关键字:初始化 实例化 | 更新日期: 2023-09-27 17:59:32
我有一个关于对委托进行编码的快速问题。
你为什么要
pf = t.Print; //instantiate and initialize the delegate.
代码
delegate void PrintFunction();
public class Test
{
public void Print()
{
Console.WriteLine("Print 1 --instance");
}
public static void Print1()
{
Console.WriteLine("Print 2 -- static");
}
}
class Program
{
static void Main(string[] args)
{
Test t = new Test();
PrintFunction pf;
pf = t.Print; //instantiate and intialize the delegate
pf += Test.Print1;
pf += t.Print;
if (null != pf)
{
pf();
}
else
Console.WriteLine("delegate is empty");
}
}
}
委托是不可变的引用类型,其默认值为null。委托的默认构造函数接受与其签名匹配的方法。
所以你可以这样做:
var pf = new PrintFunction(Test.Print1);
pf += t.Print;
或者:
var pf = Test.Print1;
pf += t.Print;
或者:
var pf = null;
pf += Test.Print1;
pf += t.Print;
编辑:
委托是参考类型的来源:MSDN
引用类型包含指向另一个内存位置的指针保存数据。参考类型包括:
- 字符串
- 所有数组,即使它们的元素是值类型
- 类类型,如Form
- 学员
您不必调用代码pf = t.Print;
。写pf = null;
是完全可以接受的。
如果删除pf = t.Print;
行,您会发现编译器会给您错误"CS0165使用未分配的局部变量'pf'"。
这与您编写的代码没有什么不同:
bool flag;
if (flag)
{
}
这与它是一名代表无关。这只是一个编译器错误。
因此,在调用委托之前,必须首先初始化它,就像调用类一样。此外,委托签名必须与调用委托的方法相匹配。
感谢大家的帮助。在我发布这个问题之前,本应该解决的。
再次感谢。
默认情况下,委托值为null,您应该将其初始化为某个值,然后使用它或添加其他方法。在您的样本中,将有两次称为t.Print,一次称为Test.Print1。
好的做法是将委托初始化为可为null的对象,然后在不进行任何null检查的情况下使用它,如下所示。
PrintFunction pf = () => {};
pf += Print1;
pf += Print;
pf += Print1;
pf();