委托

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

代码:

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. C++实现链栈相关操作代码

    #include<iostream>#include<cstdlib>using namespace std;#define MAXSIZE 100#define OK 1#d ...

  2. Beautiful Soup库的安装

    安装:'以管理员身份运行'cmd 执行pip install beautifulsoup4 Beautiful Soup库的理解: 解析.遍历.维护标签树的功能库 那么何为标签树? 1 from bs ...

  3. python 搭建自启动FTP服务器,编译后exe后个人随时可用,非常方便

    import win32apiimport win32conclass AutoRun: """ itemname:要添加的项值名称 , path:要添加的exe路径绝对 ...

  4. linux下启动jar包

    一.jdk 1.安装jdk 2.查看 摘自:(29条消息) Linux如何查看JDK的安装路径_fanyuna的博客-CSDN博客_linux查看jdk安装位置 1:echo $JAVA_HOME 使 ...

  5. centos安装Jenkins报错

    [SKIPPED] jenkins-2.249.3-1.1.noarch.rpm: Already downloaded warning: /var/cache/dnf/jenkins-0919f06 ...

  6. python_子网划分计算器

    import ipaddress class Compute: def __init__(self, network): self.net = network # 功能1: ip子网划分 def ip ...

  7. Python学习—计算机与操作系统简介

    计算机与操作系统简介 一.操作系统的主要发展史 1.手工操作--卡片穿孔 1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式.此时还没有操作系统的概念.程序员将对应于程 ...

  8. unity 阿拉伯数字转中文汉字

    直接调用即可 代码如下: using System; using System.Collections; using System.Collections.Generic; using System. ...

  9. uwsgi部署flask,flask_apscheduler任务遇到各种问题解决

    背景:最近在做的全域事件项目,快要靠近尾声了,需要用到uwsgi部署至生产环境,由于之前是debug模式,运行项目也是通过命令 python manager.py runserver (manage是 ...

  10. 树莓派Raspbian 玩耍

    树莓派Raspbian玩耍 把第一次安装树莓派并通过花生壳实现内网穿透的过程记录下来 下载工具 Win32DiskImager v0.9.zip 和 SD Formatter 4.0 for SD/S ...