委托

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

代码:

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. CodeGym自学笔记08——交互对象

    交互对象 用 Java 语言编写的每个程序都由类和对象组成. 1."Java 程序员就像设计工程师一样,只是他们不制作蓝图,而是编写类.船舶零件是根据蓝图制造的,而对象是基于类创建的.&qu ...

  2. JAVA的注释和变量名称

    1.注释 (1)单行注释为//..... 例://这是一行注释 (2)多行注释是/*.......... .............*/ 例:/*我是第一行注释 我是第二行注释 我是第三行注释*/ ( ...

  3. Hadoop2.7.3源码编译

    一.编译源码步骤演示详解 需求:官网下载的hadoop包,执行hadoop命令时,会有警告信息,为去除此警告,需要重新编译hadoop相应版本的源码,替换hadoop安装包lib目录下的native( ...

  4. linux系统下命令行方式创建KVM虚拟机

      一:安装虚拟机 1:设备重启进入BIOS打开SMMU,F10保存退出. 2:进入系统安装相关组件 virt-install qemu-kvm qemu-img virt-manager libvi ...

  5. mysql函数实现oracle的序列

    1.创建一张伪序列表 CREATE TABLE sequence ( seq_name VARCHAR (50) NOT NULL,-- 序列名称 current_val INT NOT NULL,- ...

  6. 容器之docker基础

    一 docker的介绍 Docker是一个开源的应用容器引擎,使用Go语言开发,基于Linux内核的cgroup, namespace, Union FS等技术,对应用进程进行封装隔离,并且独立于宿主 ...

  7. Android集成mupdf,实现手写笔签字,手指翻页的java代码

    import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.RectF; import ...

  8. Recycle Queue Sample

    public class RecycleQueue<T> { public int len; T[] v; int max; int front; int rear; public Rec ...

  9. python菜鸟学习: 14. GUI界面化使用

    # 获取输入框中的内容 def getVars(): global outterDomain1, innertDomian1, guestEid1, appName1, unicodeName1, r ...

  10. Jmeter学习:时间类函数

    一.__time 功能介绍:按指定格式生成当前时间 ${__time(参数 1,参数 2)} 参数 1:时间格式 参数 2:注册变量名称 二.__timeShift 功能介绍:按格式生成时间格式,并计 ...