委托

委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时,可以将其实例与任何具有兼容签名和返回类型的方法相关联。 可以通过委托实例调用方法。
可以将任何可访问类或结构中与委托类型匹配的任何方法分配给委托。 该方法可以是静态方法,也可以是实例方法。 此灵活性意味着可以通过编程方式来更改方法调用,还可以向现有类中插入新代码。

代码:

using System;

namespace Test03
{
internal class Program
{
static void Main(string[] args)
{ MyDelegate myDelegate = new MyDelegate();
myDelegate.Show(); Console.ReadKey();
}
} public class MyDelegate
{
//声明委托
//public delegate void NoReturnNoPara<T>(T t);
//public delegate void NoReturnWithPara(int x, int y);
public delegate void NoReturnNoPara(); public void Show()
{
{
//委托的实例化 (传递的方法要与定义委托的返回值和参数相同)
NoReturnNoPara method = new NoReturnNoPara(this.DoNothing);
//委托实例的调用
method.Invoke();
//调用 方式二
//method();
}
} private void DoNothing()
{
Console.WriteLine("This is DoNothing");
} private static void DoNothingStatic()
{
Console.WriteLine("This is DoNothingStatic");
} } } 

委托应用实例

假如现在有一个数据集,要对其中的数据按照相应的掉进进行筛选。代码如下:

namespace Test03
{
internal class Program
{
static void Main(string[] args)
{ var dataList = GetStudentList();
{
//查询年龄大于20
List<Student> result = new List<Student>();
foreach (var item in dataList)
{
if (item.Age > 20)
{
result.Add(item);
}
}
Console.WriteLine($"年龄大于20的共有{result.Count}人");
}
{
//查询二班中年龄大于18的
List<Student> result = new List<Student>();
foreach (var item in dataList)
{
if (item.ClassId == 2 && item.Age > 18)
{
result.Add(item);
}
}
Console.WriteLine($"二班中年龄大于18的共有{result.Count}人");
} //查询姓名长度大于2的
/*
* 具体代码和上面的类似
*/ Console.ReadKey();
} /// <summary>
/// //初始化数据
/// </summary>
/// <returns></returns>
public static List<Student> GetStudentList()
{
List<Student> studentList = new List<Student>()
{
new Student()
{
Id = 1,
Name ="萧峰",
ClassId = 1,
Age =23
},
new Student()
{
Id = 2,
Name ="段誉",
ClassId = 1,
Age =22
},
new Student()
{
Id = 3,
Name ="虚竹",
ClassId = 1,
Age =21
},
new Student()
{
Id = 4,
Name ="王语嫣",
ClassId = 2,
Age =21
},
new Student()
{
Id = 5,
Name ="阿紫",
ClassId = 2,
Age =18
},
new Student()
{
Id = 6,
Name ="阿朱",
ClassId = 2,
Age =22
}
};
return studentList;
} } } 

对于上面代码,可以使用委托将上面的代码进行优化:

using System;
using System.Collections.Generic; namespace Test03
{
//声明委托
public delegate bool ThanDelegate(Student student); class Program
{
static void Main(string[] args)
{
//调用
DemoDelegate demo = new DemoDelegate();
demo.Show1(); Console.ReadKey();
} } #region 委托示例
public class DemoDelegate
{
public void Show1()
{
var dataList = StudentList.GetStudentList();
ThanDelegate method = new ThanDelegate(Than);
var result = this.GetListDelegate(dataList, method);
Console.WriteLine($"年龄大于20的共有{result.Count}人");
} /// <summary>
/// 通的筛选方法
/// </summary>
/// <param name="source">数据源</param>
/// <param name="method">委托</param>
/// <returns></returns>
private List<Student> GetListDelegate(List<Student> source, ThanDelegate method)
{
List<Student> result = new List<Student>();
foreach (Student student in source)
{
if (method.Invoke(student))
{
result.Add(student);
}
}
return result;
} /// <summary>
/// 查询年龄大于20
/// </summary>
private bool Than(Student student)
{
return student.Age > 20;
}
} #endregion #region 数据
class StudentList
{
/// <summary>
/// //初始化数据
/// </summary>
/// <returns></returns>
public static List<Student> GetStudentList()
{
List<Student> studentList = new List<Student>()
{
new Student()
{
Id = 1,
Name ="萧峰",
ClassId = 1,
Age =23
},
new Student()
{
Id = 2,
Name ="段誉",
ClassId = 1,
Age =22
},
new Student()
{
Id = 3,
Name ="虚竹",
ClassId = 1,
Age =21
},
new Student()
{
Id = 4,
Name ="王语嫣",
ClassId = 2,
Age =21
},
new Student()
{
Id = 5,
Name ="阿紫",
ClassId = 2,
Age =18
},
new Student()
{
Id = 6,
Name ="阿朱",
ClassId = 2,
Age =22
}
};
return studentList;
}
}
#endregion } 

Student:

public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int ClassId { get; set; }
public int Age { get; set; } public void Study()
{
Console.WriteLine("This is Study");
} public static void StudyStatic()
{
Console.WriteLine("This is StudyStatic");
} public static void Show()
{
Console.WriteLine("Hello");
}
}

  

事件

namespace TestEvent
{
public delegate void MyDelegate(string name); class Program
{
static void Main(string[] args)
{
EventSource test = new EventSource();
test.TestEvent(); Console.ReadKey();
}
} public class EventSource
{
public event MyDelegate EventDelegate; public void SetCustomer(string name)
{
Console.WriteLine($"Hello,{name}");
} public void TestEvent()
{
EventSource source = new EventSource();
source.EventDelegate += new MyDelegate(source.SetCustomer);
source.EventDelegate("TanYongJun");
} } }

  

.net基础—委托和事件的更多相关文章

  1. C#基础-委托与事件

    委托 delegate是申明委托的关键字 返回类型都是相同的,并且参数类型个数都相同 委托声明 delegate double DelOperater(double num1, double num2 ...

  2. C# 基础 - 委托、事件

    1. 委托 sequenceDiagram 方法->>委托: 返回值和入参一样 委托->>方法: 调用委托就是调用绑定的方法 delegate int NumTest(int ...

  3. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  4. 【.NET基础】--委托、事件、线程(3)

    之前的两篇文章我们了解了委托和事件,本文我们看一下线程. 1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程. 2,进程和线程的关系: A,进 ...

  5. 转载 【.NET基础】--委托、事件、线程(3)

      之前的两篇文章我们了解了委托和事件,本文我们看一下线程. 1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程. 2,进程和线程的关系: A ...

  6. 转载 【.NET基础】--委托、事件、线程(2) https://www.cnblogs.com/chengzish/p/4569912.html

    [.NET基础]--委托.事件.线程(2)   本文介绍event的使用以及原理,本文接上一篇文章的Demo继续[下载上一篇Demo] 上一篇我们在类(dg_SayHi.cs)里面定义代理了4个Del ...

  7. 转载 【.NET基础】--委托、事件、线程(1) https://www.cnblogs.com/chengzish/p/4559268.html

    [.NET基础]--委托.事件.线程(1)   1,委托 是存放方法的指针的清单,也就是装方法的容器 A, 新建winform项目[01委托],项目中添加dg_SayHi.cs 委托类 用于存储方法 ...

  8. .NET零基础入门05:委托与事件

    一:前言 本小节,我们需要停一停我们的小游戏开发,虽然它现在还不完美,还很简单,甚至还有BUG.但是,为了更好的理解C#,现在到了该深入了解一些基础知识的时候了. 当然,实际上,本小节内容对于零基础入 ...

  9. C#基础知识之事件和委托

    本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.委托的调用方式.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码 ...

  10. 【.NET基础】--委托、事件、线程(2)

    本文介绍event的使用以及原理,本文接上一篇文章的Demo继续[下载上一篇Demo] 上一篇我们在类(dg_SayHi.cs)里面定义代理了4个Delegate,然后在Button的后台事件中 新建 ...

随机推荐

  1. js将json数据保存下载为json文件

    const button = document.createElement('a'); button.onclick = () => { // 要保存的字符串, 需要先将数据转成字符串 cons ...

  2. Ansible 实记

    自动化运维工具 Ansible ansible是基于模块工作的,本身没有批量部署的能力.真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架.主要包括: (1).连接插件co ...

  3. 4、Normal Equation 的向量投影解法与几何和直觉解释

    参考:https://zhuanlan.zhihu.com/p/269232332 在线性回归的正交方程 ( Normal Equation )推导一文中提到使用 向量投影 的方法一步就能推导出 正交 ...

  4. js检测数组是否有重复的数据,

    function(arr){ let hash={} for (const key in arr){ if(hash[arr[key]]){ return true } hash[arr[key]]= ...

  5. Python的入门学习Day 19~21——form”夜曲编程“

    ..Day 19 time:2021.8.16. ​ 很神奇地,编程和数学渐渐有了交集--今天学习了函数,连模样都像 f(x) 的形式.比较有区分度的是,在P里,"x"被称为&qu ...

  6. Java基础学习:12、代码块

    1.定义: 代码块又称为初始化块,属于类中的成员,将逻辑语句封装在方法体中,通过{}包围起来. 2.分类: 普通代码块.静态代码块(有static修饰) public class Block { pu ...

  7. 算法学习—————PAM回文自动机

    时隔一年,第一次学习新的算法 原理和AC自动机差不多 基本思想: 两棵树分别代表奇偶 在一个回文串两边同时填上相同字符可以得到另一个回文串,以此构建两棵树 树上维护信息: 节点表示的回文串为当前位置的 ...

  8. 51电子-STC89C51开发板:安装KEIL

    全部内容,请点击: 51电子-STC89C51开发板:<目录> ---------------------------  正文开始  --------------------------- ...

  9. 直播软件搭建,姓名,身份证input验证过滤

    直播软件搭建,姓名,身份证input验证过滤 姓名验证:需求,可输入英文.汉字 for(let i=0;i<e.length;i++){  if(/^[a-zA-Z\u4e00-\u9fa5]+ ...

  10. GIS空间分析和建模复习重点4

    27.三维地形分析的方法 常用的有 ·坡度分析 ·坡向分布 ·填挖方分析 ·山体阴影分析 ·通视分析 28.空间分析实际应用 (1)城市应急避难场所是城市防灾减灾规划的重要组成部分,应急避难场所的建设 ...