委托是个啥呢?
委托是个类,我们来验证一下
using System;
using System.Collections.Generic;
namespace CustomizeDelegate
{
class Program
{
static void Main(string[] args)
{
Type t = typeof(Action);
Console.WriteLine(t.IsClass);//返回true,说明Action委托是类
}
}
}
程序结果:
true
所以证明委托是个类。
非自定义的Action和Func委托
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DeleGateClass
{
class Program
{
static void Main(string[] args)
{
//创建一个对象,这也我们可以用他的方法
Calculator Deli = new Calculator();
//Action委托类,构造函数(对象.函数名)
Action action = new Action(Deli.Report);//Action(不加(),仅传入无返回值(返回值为void)的函数名),只需要方法名,而不是调用这个方法
//action这个委托指向了Deli.Report()这个方法
///直接调用,不通过委托
Deli.Report();
///间接调用,通过委托
action.Invoke();//在拥有此控件的基础窗口句柄(对程序语句是二两拨千斤的存在,因此叫句柄)的现呈上同步执行指定的委托(同步)
//模仿函数指针书写格式
action();
Func<int, int, int> Func1 = new Func<int, int, int>(Deli.Add);
Func<int, int, int> Func2 = new Func<int, int, int>(Deli.Sub);
int x = 100;
int y = 200;
int z = 0;
///间接调用
z = Func1.Invoke(x, y);
Console.WriteLine(z);
z = Func2.Invoke(x, y);
Console.WriteLine(z);
//模仿函数指针书写格式
z = Func1(x, y);
Console.WriteLine(z);
z = Func2(x, y);
Console.WriteLine(z);
}
}
/// <summary>
/// 计算器类,它包括加减功能
/// </summary>
class Calculator
{
public void Report()
{
Console.WriteLine("I have 3 methods");
}
/*加*/
public int Add(int a, int b)
{
int result = a + b;
return result;
}
/*减*/
public int Sub(int a, int b)
{
int result = a - b;
return result;
}
}
}
程序结果:
I have 3 methods——Deli.Report(); ///直接调用,不通过委托
I have 3 methods——action.Invoke(); ///间接调用,通过委托
I have 3 methods——action();//模仿函数指针书写格式
300——z = Func1.Invoke(x, y);Console.WriteLine(z);///间接调用
-100——z = Func2.Invoke(x, y);Console.WriteLine(z);
300——z = Func1(x, y);Console.WriteLine(z);//模仿函数指针书写格式
-100——z = Func2(x, y);Console.WriteLine(z);
请按任意键继续. . .
自定义Calc委托
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CustomizeDelegate
{
//委托类(因为是类,与其他类平级,所以声明在命名空间里)的声明格式与普通类不同,他的声明格式是仿照函数指针
public delegate double Calc(double Variable1, double Variable2);
//这种数据类型从什么地方都可以访问,公开的(public)
//告诉编译器我现在要声明一个委托(delegate)
//目标方法的返回值类型(double)
//给委托起个名(Calc)
//目标方法的参数列表((double Variable1, double Variable2))
//分号(;)
class Program
{
static void Main(string[] args)
{
Calculator Deli = new Calculator();
//创建Calcuator类的实例Deli,有了这个实例之后才能访问它的方法
Calc calcAdd = new Calc(Deli.Add);
//创建Calc委托的实例calcAdd,这里要求在传入方法即委托指向的目标方法,要求参数列表是两个double类型参数,返回值也是double类型
Calc calcSub = new Calc(Deli.Sub);
Calc calcMul = new Calc(Deli.Mul);
Calc calcDiv = new Calc(Deli.Div);
double a = 100;
double b = 200;
double c = 0;
c = calcAdd.Invoke(a, b);
Console.WriteLine(c);
c = calcSub(a, b);
Console.WriteLine(c);
c = calcMul(a, b);
Console.WriteLine(c);
c = calcDiv(a, b);
Console.WriteLine(c);
}
}
class Calculator
{
public double Add(double x, double y)
{
return x + y;
}
public double Sub(double x, double y)
{
return x - y;
}
public double Mul(double x, double y)
{
return x * y;
}
public double Div(double x, double y)
{
return x / y;
}
}
}
程序结果:
300
-100
20000
0.5
请按任意键继续. . .
原文:https://www.cnblogs.com/maomaodesu/p/11393254.html