C#委托的几种表现方式

以Func为例子:

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

namespace mytest.del
{
    class Program
    {

        static Func<int, int, int> plusDel;
        static void Main(string[] args)
        {
            plusDel = delegate(int a, int b)
            {
                return a + b;
            };
            int sum1 = plusDel(1, 1);

            plusDel = (a, b) =>
            {
                return a + b;
            };
            int sum2 = plusDel(1, 1);

            plusDel = new Func<int, int, int>((a, b) =>
            {
                return a + b;
            });
            int sum3 = plusDel(1, 1);

            plusDel = new Func<int, int, int>(GetResult);
            int sum4 = plusDel(1, 1);

            Console.WriteLine(string.Format("sum1={0},sum2={1},sum3={2},sum4={3}", sum1, sum2, sum3, sum4));
            Console.ReadKey();

        }

        private static int GetResult(int a, int b)
        {
            return a + b;
        }
    }
}

这里的sum1,sum2,sum3,sum4都是为2的。

现在我们自己定义一个委托:

class Program
    {

        delegate int PlusDel(int a, int b);
        static void Main(string[] args)
        {
            PlusDel del1= GetResult;
            PlusDel del2 = new PlusDel(GetResult);
            PlusDel del3 = (a, b) => { return a + b; };
            int sum1 = del1(1, 1);
            int sum2 = del2(1, 1);
            int sum3 = del3(1, 1);
        }

        private static int GetResult(int a, int b)
        {
            return a + b;
        }
    }

这里的sum1,sum2,sum3的计算结果也会是一样的。

对于参数声明成delegate的类,可以如下进行操作:

Thread thread1 = new Thread(() => { });
            Thread thread2 = new Thread(new ThreadStart(() => { }));
            Thread thread3 = new Thread(new ThreadStart(delegate { }));
            Thread thread4 = new Thread(new ThreadStart(Method));
private void Method()
        { 
        
        }

这4个线程的效果可以一样。因为ThreadStart是delegate声明的。

但是对于Delegate声明的参数,如下代码:

this.BeginInvoke(new Action<int, int>((a, b) =>
            {

            }), new object[] { 1, 1 });

必须使用new关键字进行实例化委托对象。BeginInvoke的原型是如下的:

public IAsyncResult BeginInvoke(Delegate method, params object[] args);

错误或者不足的地方,欢迎大家指正。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值