委托

委托:如果我们要把方法当做参数来传递的话,就要用到委托。简单来说 委托
是一个类型,这个类型可以赋值一个方法的引用。
对于委托类型可以赋值一个方法的引用 ,可以把一个方法赋值过来,通过这个委托变量调用这个方法

归纳起来,可以被委托包装的方法必须满足以下规则:
1:方法的签名必须与委托一致,方法签名包括参数的个数,类型和顺
序。
2:方法的返回类型要和委托一致。
与上面方法对应的函数可以是下面的这种:
public void MyMethod(int a,string b)

声明委托:
在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字段和方法组成的,然后使用这个类实例化对象。在我们使用委托的时候,也需要经过这两个阶段,首先定义委托,告诉编译器我们这个委托可以指向哪些类型的方法,然后,创建该委托的实例。

private delegate string GetAString();

static void Main(){
int x = 40;
GetAString firstStringMethod = new GetAString(x.ToString);
Console.WriteLine(firstStringMethod());
}

委托的赋值:
GetAString firstStringMethod = new GetAString(x.ToString);只需要把方法名给一个委托的构造方法就可以了
GetAString firstStringMethod = x.ToString;也可以把方法名直接给委托的实例

using System;
using System.Collections.Generic;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 委托
{
class Program
{
delegate string Text();//声明一个委托
static void Main(string[] args)
{
int age = 27;
//string s = age.ToString();//转换为string类型
// Text t = new Text(age.ToString);//t指向的就是tostring()这个方法
//string s = t();//通过委托实例去调用方法
// string s = t.Invoke();
Text t = age.ToString;//把方法赋值给委托类型的变量
//string s = t();
string s = t.Invoke();
Console.WriteLine(s);
Console.ReadKey();

    }
}

}

using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 委托1
{
delegate void Text();
class Program
{
static void text1(Text t)
{
t();
}
static void text2()
{
Console.WriteLine(“测试2”);
}
static void text3()
{
Console.WriteLine(“测试3”);
}
static void Main(string[] args)
{
Text T = text2;
text1(T);
Console.ReadKey();
}
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication25
{

class Program
{
   public delegate void Text();//委托的命名类型必须与要实现的方法一致,参数一致
   public static void text2(Text t)//委托类型的变量可以当成一个方法来用
    {
        t();
    }
    public static void text1()
    {
        Console.WriteLine("测试1");
    }
    public static string text(string name)
    {
        Console.WriteLine("测试");
        return name;
    }
    static void Main(string[] args)
    {
        Text T =text1;
        text2(text1);
        //T("dfsg");
        Console.ReadKey();
    }
}

}

为什么要引入委托
我们通过下面的例子来看一下为什么使用委托,有什么好处?
首先我们不使用委托来实现下面的代码:
??? /? 7 11
class MainClass{
public void Greeting(string name,string language){
switch(language)
{
case “zh-cn”:
ChineseGreeting (name);
break;
case “en-us”:
EnglishGreeting (name);
break;
default:
break;
}
}
public void EnglishGreeting(string name){
Console.WriteLine(“hello”+name);
}
public void ChineseGreeting(string name){
Console.WriteLine("??"+name);
}
static void Main(string[] args){
MainClass p=new MainClass();
p.Greeting ("??", “zh-cn”);
}
}
以上实现方法的可扩展性很差,如果之后我们需要添加多个国
家,那么维护起来比较复杂。有了委托,我们可以将函数作为参数,
并像下面的代码去实现Greeting方法了。
class MainClass{
public delegate void GreetingDelegate(string
name);//???
public void Greeting(string
name,GreetingDelegate del){
del(name);
}
??? /? 8 11
public void EnglishGreeting(string name){
Console.WriteLine(“hello”+name);
}
public void ChineseGreeting(string name){
Console.WriteLine("??"+name);
}
static void Main(string[] args){
MainClass p=new MainClass();
p.Greeting ("??", p.ChineseGreeting);
p.Greeting (“lisi”, p.EnglishGreeting);
}
}
引入委托之后,我们可以把函数作为参数传递给另外一个方法
了。委托可以提高方法扩展性。

函数签名:函数名+参数列表

回调函数:把函数当成参数传递

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值