委托重载和使用

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

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

委托重载和使用的相关文章

委托转换,委托重载

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 {     delegate void MyAction();     delegate void MyAction<T>(T obj);     delegate void MyAction<T1,

多播委托和事件

事件的创造规则是类型必须是一个委托的类型,也就是说是委托实例化了事件 事例代码如下: 这是两个以后要被委托的方法: public class EventManager { //第一个方法 public void Add(int i,int j) { int res = i + j; MessageBox.Show(res.ToString()); } //第二个方法 public void SayHello(int i,int j) { MessageBox.Show("hello word&q

C#编程(六十二)---------LINQ标准的查询操作符

LINQ标准的查询操作符 首先我们来看一下LINQ的操作符,可根据查询操作符的操作"类型"进行分类,如把它们分成投影,限制,排序,联接,分组,串联,聚合,集合,生成,转换,元素,相等,量词,分割等. 类型 操作符名称 投影操作符 Select,SelectMany 限制操作符 Where 排序操作符 OrderBy,OrderByDescending,ThenBy,ThenByDescending,Reverse 联接操作符 Join,GroupJoin 分组操作符 GroupBy 串

[Learn Android Studio 汉化教程]第四章 : Refactoring Code

[Learn Android Studio 汉化教程]第四章 : Refactoring Code 第四章 Refactoring Code    重构代码 在Android Studio中开发,解决方案不会总是一蹴而成的.作为一个有效率的编程者,在你的开发,调试和测试中需要一些弹性以及代码重构.随着在这章中的行进,你将明白Android Studio如何产生代码:在这章里你将看到Android Studio如何重构你的代码.重构代码最大的风险是可能引入不期望的错误.通过分析某些风险重构操作的结

C#高级编程六十二天----LINQ标准的查询操作符

LINQ标准的查询操作符 首先我们来看一下LINQ的操作符,可根据查询操作符的操作"类型"进行分类,如把它们分成投影,限制,排序,联接,分组,串联,聚合,集合,生成,转换,元素,相等,量词,分割等. 类型 操作符名称 投影操作符 Select,SelectMany 限制操作符 Where 排序操作符 OrderBy,OrderByDescending,ThenBy,ThenByDescending,Reverse 联接操作符 Join,GroupJoin 分组操作符 GroupBy 串

.net 综合面试题

想换工作的朋友可以试着做一下:1. CLR.CTS.CLS 分别是什么意思? 公共语言运行库,通用类型系统,公共语言规范2. 什么是基元类型? 由编译器直接支持的数据类型称为基元类型. 例如:C#中的int,string等等就是,实际运行过程中被映射为FCL中对应的类型(java中叫做包装类)如:System.Int32,System.String. ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_fxintro/html/7e4c5921-955d-4b

【C#】分享带等待窗体的任务执行器一枚

适用环境:.net 2.0+的Winform项目. 先解释一下我所谓的[带等待窗体的任务执行器]是个什么鬼,就是可以用该类执行任意耗时方法(下文将把被执行的方法称为任务或任务方法),执行期间会显示一个模式等待窗体,让用户知道任务正在得到执行,程序并没有卡死.先看一下效果: 功能: 等待窗体可以使用执行器自带的默认窗体(就上图的样子),嫌丑你也可以使用自己精心设计的窗体,甚至基于Devpress.C1等第三方漂亮窗体打造也是完全可以的 在任务中可以更新等待窗体上的Label.ProgressBar

第四章:重构代码[学习Android Studio汉化教程]

第四章 Refactoring Code The solutions you develop in Android Studio will not always follow a straight path from design to finish. To be an effective Android programmer, you need to be flexible and refactor your code as you develop, debug, and test. In t

多种方法求最大值(委托方法,重载)

1 namespace ConsoleAppLearningCeshi 2 { 3 /// <summary> 4 /// 不同打招呼 5 /// </summary> 6 /// <param name="name"></param> 7 public delegate int deleMaxCompara<T>(T one, T two);//泛型委托 8 public delegate int deleMaxCompar