c#中的委托(一)
2021-01-05 18:29
标签:details img 理解 sys 需要 重载函数 using 语言 面向 1.委托的定义 官网解释:委托类型表示对具有特定参数列表和返回类型的方法的引用。 通过委托,可以将方法视为可分配给变量并可作为参数 传递的实体。委托还类似于其他一些语言中存在的“函数指针”概念。 与函数指针不同,委托是面向对象且类型安全的。 说明: (1)可以直接定义在命名空间下面,与其他的类平级,也可以定义在类的内部,如果定义在类的内部则需要调用该类的成员才能使用。 (2)委托类似于方法(或函数)的模板,相当于是对方法的抽象,而类是对一组属性和行为的抽象。 1.1委托的声明 访问修饰符 delegate 返回值 方法名(形参列表) 1.2委托的实例化 委托的使用类似于普通的类,可以理解为特殊的类,使用new关键字创建委托对象。 委托 委托对象 = new 委托(方法名); Program p = new Program(); 上述代码中,委托对象t1就指向了ExamTest,t2对象就指向了CommonTest方法。 注意:此处的方法名所代表的方法必须与声明委托的方法签名一样,也就是说,ExamTest方法的返回值和参数列表与Test委托一致 2.委托类型的使用 再定义个方法,以委托类型Test的对象为形参 需要注意的是,在具体使用委托对象时(也就是需要委托对象所代表的方法返回值)做计算,返回值等操作,委托对象T1,和T2就必须要有参数列表并给定实参,如T1(90.4), T2(86.3),且实参的类型需要与定义时的形参类型相同。 在main方法中调用 运行结果 3.小结 (1)委托类型是方法的抽象,可以使用委托类型作为方法的形参,代表了一组返回值和形参列表相同的方法。类似接口可以作为方法的形参,实现这个接口的类都可以替换该接口作为方法的实参。接口实现了类级别的多态,委托实现了“方法”级别的多态,虽然不准确,但是可以这么理解。 (2)委托对象做为方法的形参时(如public string TotalTest(Test T1, Test T2)),如果需要用到委托类型的返回值时,必须加上所指向方法的实参(如commonTest(86.3), examTest(90.4))。委托对象作为形参时,不关心将来需要指向的方法是谁,只有当委托对象有具体指向的方法,并需要使用到方法的返回值时,才需要加上指定类型的实参。 4.源代码 参考文章: https://docs.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/delegates https://blog.csdn.net/lizhenxiqnmlgb/article/details/82141968 c#中的委托(一) 标签:details img 理解 sys 需要 重载函数 using 语言 面向 原文地址:https://www.cnblogs.com/YorkZhangYang/p/13176871.htmlpublic delegate double Test(double r)
Test t1 = new Test(ExamTest);
Test t2 = new Test(p.CommonTest); //此处ExamTest为静态方法,可以在Program类的main方法中直接调用
public static double ExamTest(double score)
{
return 0.6 * score;
}
//此处CommonTest为实例方法,需要在Program类的对象中调用
public double CommonTest(double score)
{
return 0.4 * score;
}public string TotalTest(Test T1, Test T2)
{
return String.Format("期末总成绩为期考成绩*0.6={0}+平时成绩*0.4={1}的和={2}",
T1(90.4), T2(86.3), T1(90.4) + T2(86.3));
}
Program p = new Program();
//此处分别创建了2个委托对象,分别指向了静态方法ExamTest和实例方法CommonTest
Test t1 = new Test(ExamTest);
Test t2 = new Test(p.CommonTest);
Console.WriteLine(p.TotalTest(t1, t2));using System;
namespace 委托3
{
class Program
{
public delegate double Test(double r);
//此处ExamTest为静态方法,可以在Program类的main方法中直接调用
public static double ExamTest(double score)
{
return 0.6 * score;
}
//此处CommonTest为实例方法,需要在Program类的对象中调用
public double CommonTest(double score)
{
return 0.4 * score;
}
//委托对象t1,t2作为其他方法形参时,可以指向任何返回值与形参列表相同的方法
public string TotalTest(Test T1, Test T2)
{
return String.Format("期末总成绩为期考成绩*0.6={0}+平时成绩*0.4={1}的和={2}",
T1(90.4), T2(86.3), T1(90.4) + T2(86.3));//委托对象(实参),相当于指定了实参,调用了一组返回值与形参列表相同的方法
}
public string TotalTest(double[] score, Test T1, Test T2)
{
return String.Format("期末总成绩为期考成绩*0.6={0}+平时成绩*0.4={1}的和={2}",
T1(score[0]), T2(score[1]), T1(score[0]) + T2(score[1]));
}
static void Main(string[] args)
{
Program p = new Program();
//此处分别创建了2个委托对象,分别指向了静态方法ExamTest和实例方法CommonTest
Test t1 = new Test(ExamTest);
Test t2 = new Test(p.CommonTest);
/*TotalTest方法的形参是2个已经指向了具体方法的委托对象,具体方法的需要的实参已经在
TotalTest方法中指定了,如 T1(90.4), T2(86.3), T1(90.4) + T2(86.3)*/
Console.WriteLine(p.TotalTest(t1, t2));
//模仿官网的例子写了个TotalTest的重载函数,在另外一个形参中初始化2个委托对象所需要的实参
double[] score = { 90.4,86.3};
Console.WriteLine(p.TotalTest(score,t1, t2));
Console.ReadLine();} } }
T1