C#的委派

本文深入介绍了C#中的委托概念,将其与C语言的函数指针进行类比,并展示了如何声明、实例化和调用委托。文中通过示例详细解释了不同类型的委托声明,包括参数和返回类型。同时,还演示了在C#1.0到C#3.0中委托实例化的不同方法,如匿名方法、方法组转换和lambda表达式。此外,还阐述了同步和异步调用委托的实现,包括BeginInvoke和EndInvoke方法的使用。
摘要由CSDN通过智能技术生成

委托(Delegate)

什么是委托?

使用委托就是可以把方法当做变量使用

在C语言中     函数指针是指向一个函数的地址       函数指针变量可以作为一个参数进行传递      在C#中可以将委托类比成C语言中的函数指针        将可变的操作当做参数传入方法中进行调用

委托声明

声明委托变量之前要声明委托类型     用来指定方法签名(委托返回类型   参数列表)的信息    这里声明了几种不同的委托类型

/// <summary>

/// 参数类型为object的委托类型

/// </summary>

/// <param name="objPara"></param>

public delegate void InputObjDelegate(object objPara);

/// <summary>

/// 参数类型为string的委托类型

/// </summary>

/// <param name="strPara"></param>

public delegate void InputStrDelegate(string strPara);

/// <summary>

/// 参数类型为int的委托类型

/// </summary>

/// <param name="intPara"></param>

public delegate void InputIntDelegate(int intPara);

/// <summary>

/// 返回类型为object的委托类型

/// </summary>

/// <returns></returns>

public delegate object OutputObjDelegate();

/// <summary>

/// 返回类型为int的委托类型

/// </summary>

/// <returns></returns>

public delegate int OutputIntDelegate();

定义一个类用于展示委托的使用   在类中提供了几个实例方法与静态方法用于委托实例化     (MyPrint类)

public class MyPrint

{

    /// <summary>

    /// 打印object静态方法

    /// </summary>

    /// <param name="objPara"></param>

    public static void StaticPrintObject(object objPara)

    {

        Console.WriteLine("打印object静态方法:" + objPara);

    }

    /// <summary>

    /// 打印string静态方法

    /// </summary>

    /// <param name="strPara"></param>

    public static void StaticPrintStr(string strPara)

    {

        Console.WriteLine("打印string静态方法:" + strPara);

    }

    /// <summary>

    /// 返回类型为string静态方法

    /// </summary>

    /// <returns></returns>

    public static string StaticReturnStr()

    {

        Console.WriteLine("返回string静态方法");

        return "返回string静态方法";

    }

    /// <summary>

    /// 返回类型为Int静态方法

    /// </summary>

    /// <returns></returns>

    public static int StaticReturnInt()

    {

        Console.WriteLine("返回Int静态方法");

        return 0;

}

#【c#心得记录】委托细节一#

  /// <summary>

    /// 打印string方法

    /// </summary>

    /// <param name="strPara"></param>

    public void PrintStr(string strPara)

    {

        Console.WriteLine("打印string方法:" + strPara);

    }

/// <summary>

    /// 返回类型为string方法

    /// </summary>

    /// <returns></returns>

    public string ReturnStr()

    {

        Console.WriteLine("返回string静态方法");

        return "返回string静态方法";

    }

}

委托的实列化

C#1.0版本委托的实例化与类一样   使用new关键字   构造的时候需要传参数类型数完全相同的方法      非静态方法需要首先实例化对象  使用实例化对象传入方法        静态方法需要使用类名传入方法

MyPrint myPrint = new MyPrint();

InputStrDelegate delInStr = new InputStrDelegate(myPrint.PrintStr);//非静态方法实例化

delInStr = new InputStrDelegate(MyPrint.StaticPrintStr);//静态方法实例化

C#2.0版本提供了匿名方法  方法组转换   可以使用这两种语法进行委托实例化

//匿名方法实例化

delInStr = delegate (string strPara)

{

    return;

};

delInStr = MyPrint.StaticPrintStr;//方法组转换实例化

使用省略参数的匿名方法实例化委托时    这种省略参数的匿名方法可以转换为具有任何参数列表的委托类型

C#3.0版本使用lambda 表达式进行委托实例化  也不支持参数省略的功能

//lambda表达式实例化

delInStr = (p) =>

{

    Console.WriteLine("委托实例化:lambda表达式");

};

委托的调用

委托调用分为同步调用与异步调用  首先实例化一个委托用于委托调用

InputStrDelegate delInStrInvoke = (p) =>

{

    Console.WriteLine("委托调用");

};

同步调用

使用委托实例的Invoke方法可以进行委托的同步调用  参数列表与委托相同

delInStrInvoke.Invoke("参数");

C#为我们提供了另一种方式 可以使用更简单的方式进行调用  就像正常调用方法一样

delInStrInvoke("参数");

异步调用

使用委托实例的BeginInvoke方法可以进行委托的异步调用  该方法会使用一个后台线程进行异步的操作   参数列表中除去最后两个之外  与委托参数列表相同  最后两个参数分别传入回调方法 异步状态值(不使用可以传入null)

//AsyncCallback参数传入回调方法(委托)

//object参数传入回调State参数 回调方法中使用IAsyncResult参数类型的AsyncState属性获取

//后台线程

IAsyncResult  asyncResult = delInStrInvoke.BeginInvoke("参数",

    (p) =>

    {

        Console.WriteLine(p.AsyncState);

    },

    "回调State参数");

异步调用状态/结果有以下几种处理方式

while(!asyncResult.IsCompleted) { };//IsCompleted判断操作是否完成

asyncResult.AsyncWaitHandle.WaitOne();//阻塞等待操作完成

delInStrInvoke.EndInvoke(asyncResult);//阻塞等待操作完成 获取返回类型值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值