.net基础—委托和事件
委托
委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时,可以将其实例与任何具有兼容签名和返回类型的方法相关联。 可以通过委托实例调用方法。
可以将任何可访问类或结构中与委托类型匹配的任何方法分配给委托。 该方法可以是静态方法,也可以是实例方法。 此灵活性意味着可以通过编程方式来更改方法调用,还可以向现有类中插入新代码。
代码:
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基础—委托和事件的更多相关文章
- C#基础-委托与事件
委托 delegate是申明委托的关键字 返回类型都是相同的,并且参数类型个数都相同 委托声明 delegate double DelOperater(double num1, double num2 ...
- C# 基础 - 委托、事件
1. 委托 sequenceDiagram 方法->>委托: 返回值和入参一样 委托->>方法: 调用委托就是调用绑定的方法 delegate int NumTest(int ...
- .NET基础拾遗(4)委托、事件、反射与特性
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- 【.NET基础】--委托、事件、线程(3)
之前的两篇文章我们了解了委托和事件,本文我们看一下线程. 1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程. 2,进程和线程的关系: A,进 ...
- 转载 【.NET基础】--委托、事件、线程(3)
之前的两篇文章我们了解了委托和事件,本文我们看一下线程. 1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程. 2,进程和线程的关系: A ...
- 转载 【.NET基础】--委托、事件、线程(2) https://www.cnblogs.com/chengzish/p/4569912.html
[.NET基础]--委托.事件.线程(2) 本文介绍event的使用以及原理,本文接上一篇文章的Demo继续[下载上一篇Demo] 上一篇我们在类(dg_SayHi.cs)里面定义代理了4个Del ...
- 转载 【.NET基础】--委托、事件、线程(1) https://www.cnblogs.com/chengzish/p/4559268.html
[.NET基础]--委托.事件.线程(1) 1,委托 是存放方法的指针的清单,也就是装方法的容器 A, 新建winform项目[01委托],项目中添加dg_SayHi.cs 委托类 用于存储方法 ...
- .NET零基础入门05:委托与事件
一:前言 本小节,我们需要停一停我们的小游戏开发,虽然它现在还不完美,还很简单,甚至还有BUG.但是,为了更好的理解C#,现在到了该深入了解一些基础知识的时候了. 当然,实际上,本小节内容对于零基础入 ...
- C#基础知识之事件和委托
本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.委托的调用方式.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码 ...
- 【.NET基础】--委托、事件、线程(2)
本文介绍event的使用以及原理,本文接上一篇文章的Demo继续[下载上一篇Demo] 上一篇我们在类(dg_SayHi.cs)里面定义代理了4个Delegate,然后在Button的后台事件中 新建 ...
随机推荐
- 【剑指Offer】【树】序列化二叉树
题目:请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存.序列化可以基于先序. ...
- 解决MySQL5.5MySQLInstanceConfig最后一步setting报错
问题描述 在安装过MySQL(或已卸载)的电脑中重新安装MySQL5.5, 在安装最后一项中Processing configuration中最后一项配置失败: 问题解决: 首先关于卸载: 安装时候若 ...
- cookie,session,token,drf-jwt
1.cookie,session,token发展史 引入:我们都知道 http 协议本身是一种无状态的协议,一个普通的http请求简单分为三步:客户端发送请求request服务端收到请求并进行处理服务 ...
- react项目打包后点击index.html页面出现空白
当本地打包后的文件,直接通过文件路径访问,出现空白或者,提示打包后的build内的js,css文件路径错误,有以下两种方式 方式一(无网络限制的情况下使用): 1.全局安装serve启动本地服务: n ...
- Git命令学习总结(廖雪峰官方Git教程)
1.Windows系统安装完Git后,需要在Git Bash命令窗口输入以下命令,进行用户名和邮箱设置.
- 【ML】序
以下序言,没有什么实质性内容 搞车需要,头铁开个Machine Learning栏目,希望能长更.
- ClickHouse 使用
最近mysql报表数据太多,要转移数据到 clickHouse ,顺便学学该数据仓库的使用 中文文档:https://clickhouse.com/docs/zh/ B站学习视频 : https:// ...
- -bash: pip: command not found
使用pip安装软件包时报错命令不存在 [root@test ~]# pip -V -bash: pip: command not found 机器上没有安装pip,需要手动进行安装 centos系统: ...
- Java 根据模板导出PDF
目录 前言 思路一:直接导出pdf 使用itext模板导出pdf 思路二:先导出word再转成pdf 1)导出word 2)word转pdf 最终方案 docx4j spire.doc.free + ...
- Science Word丨快速创建各种数学、物理、化学图形,让老师的工作更轻松!
很多老师,尤其是理科老师,在出试卷或做课件时需要绘制图像,很多老师会直接在PPT上绘制,但要画得专业点很是费时费力.ScienceWord提供了大量的数学.物理和化学常用的图形,能快速创建各种数学图形 ...