重新整理一下,趁着现在项目有时间,还有那些语法糖,哎,最二了! 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; } }
时间: 2024-11-06 21:04:35