委托本质是一个类,只不过带的参数换为指定函数。网上有很多教程谈及delegate的声明,实例化等等,这里浅谈我的理解。
例如下面是一个控制台程序,声明delegate可以在命名空间下,也可以在class下,因为delegate本质是一个类!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DelegateDemo
{
//delegate double Mydelegate(double num1, double num2);
class Program
{
delegate double Mydelegate(double num1, double num2);
static void Main(string[] args)
{
//同一Project
TestClass testClass = new TestClass();
Mydelegate delegate1 = testClass.Plus;
Console.WriteLine(delegate1(1.5, 5.5));
//不同Project
//TestOutProject.TestOutClass testOutProject = new TestOutProject.TestOutClass();
//Mydelegate delegate2 = testOutProject.Multipiy;
//Console.WriteLine(delegate2(1.5,5.5));
Console.ReadKey();
}
}
}
同一项目内创建TestClass类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DelegateDemo
{
class TestClass
{
public double Plus(double num1 ,double num2)
{
return num1 + num2;
}
}
}
运行后的结果:
以上在任何关于delegate的教程中都应该可以看到!
接下来关键:创建新项目TestOutProject,在该项目下创建类TestOutClass,并创建相应的函数,如下:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestOutProject
{
public class TestOutClass
{
public double Multipiy(double num1, double num2)
{
return num1 * num2;
}
}
}
将该项目引入控制台
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DelegateDemo
{
//delegate double Mydelegate(double num1, double num2);
class Program
{
delegate double Mydelegate(double num1, double num2);
static void Main(string[] args)
{
//同一Project
//TestClass testClass = new TestClass();
//Mydelegate delegate1 = testClass.Plus;
//Console.WriteLine(delegate1(1.5, 5.5));
//不同Project
TestOutProject.TestOutClass testOutProject = new TestOutProject.TestOutClass();
Mydelegate delegate2 = testOutProject.Multipiy;
Console.WriteLine(delegate2(1.5, 5.5));
Console.ReadKey();
}
}
}
运行:
没有问题!
我觉得例中delegate方法的最为关键就是这两段代码:
Mydelegate delegate1 = testClass.Plus;
Mydelegate delegate2 = testOutProject.Multipiy;
(PS:指定函数的签名和delegate的签名一致,这是必要的!!!)
此时,再回首开头说的“只不过带的参数换为指定函数”,也就是说delegate可以完成跨项目的相关函数、参数的引用等等,至此完成闭环!