实例化并初始化委托

本文关键字:初始化 实例化 | 更新日期: 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();