委托重载和使用

重新整理一下,趁着现在项目有时间,还有那些语法糖,哎,最二了!

MSDN的解释:https://msdn.microsoft.com/zh-cn/library/vstudio/ms173171(v=vs.110).aspx

    委托是一种定义方法签名的类型。 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联。 您可以通过委托实例调用方法。

    委托用于将方法作为参数传递给其他方法。 事件处理程序就是通过委托调用的方法。 您可以创建一个自定义方法,当发生特定事件时某个类(例如 Windows 控件)就可以调用您的方法。 

与委托的签名(由返回类型和参数组成)匹配的任何可访问类或结构中的任何方法都可以分配给该委托。 方法可以是静态方法,也可以是实例方法。 这样就可以通过编程方式来更改方法调用,还可以向现有类中插入新代码。 只要知道委托的签名,就可以分配您自己的方法。

委托具有以下特点:

  • 委托类似于 C++ 函数指针,但它们是类型安全的。

  • 委托允许将方法作为参数进行传递。

  • 委托可用于定义回调方法。

  • 委托可以链接在一起;例如,可以对一个事件调用多个方法。

  • 方法不必与委托签名完全匹配。 

  • C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。

  •  C# 3.0 引入了 Lambda 表达式,利用它们可以更简练地编写内联代码块。 匿名方法和 Lambda 表达式(在某些上下文中)都可编译为委托类型。 这些功能统称为匿名函数。 有关 lambda 表达式的更多信息,请参见 匿名函数(C# 编程指南)



namespace
GXProjectTest.Lambda { /* 委托 */ public class TestDelegate { public void Demo1(Test<int> test) { if (test != null) test(1); } public string Demo2(Test<int, string, string> test) { if (test != null) { return test(1, "sss"); } return string.Empty; } public string Demo3(TestStr<int, string, string> tt) { if (tt != null) return tt(1, ""); return string.Empty; } public void Demo4(Test t) { if (t != null) t(); } } public delegate void Test(); public delegate void Test<in T>(int a); public delegate string Test<in T1, in T2, out TResult>(int a, string b); public delegate string TestStr(); public delegate string TestStr<in T>(int a); public delegate string TestStr<in T1, in T2, out TResult>(int a, string b); }

测试代码

    public partial class TestDelegateWeb : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //测试

            TestDelegate testDelegate = new TestDelegate();

            testDelegate.Demo1(Test);//有参数的
            testDelegate.Demo2(Test1);
            testDelegate.Demo3(Test1);
            testDelegate.Demo4(Test);//没有参数的

        }

        public void Test()
        {

        }
        public void Test(int a)
        {
            //随便写
        }

        public string Test1(int a, string b)
        {
            return string.Empty;
        }
    }
原文地址:https://www.cnblogs.com/wucaifang/p/4589131.html