关于委托的声明,实例化,官方有如下几种方式:
new ,简单声明,匿名(){},lambda四种方式
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TaskDemo
{
class DelegateDemo
{
//委托,声明,实例化,以及使用委托
public delegate void Del(string str);
public delegate string Del2(string str);
//第一种方法:非常传统方式,定义一个该委托类型的方法,
public void Notify(string name) {
Console.WriteLine(name);
}
public void Notify_()
{
Console.WriteLine("无参");
}
//第一种方法:C# 2.0语法中,new一个实例
public void TestDemo1()
{
Del delinstance =new Del(Notify);
//Del delinstance2 = Notify_;
}
//第二种方法:C# 2.0语法中,简单声明
public void TestDemo2()
{
Del delinstance = Notify;
//Del delinstance2 = Notify_;
}
//第三种方法:C# 2.0语法中,及更高版本中,还有匿名方式
public void TestDemo3()
{
//接受一个类似的委托,匿名方式定义一个委托
Del delinstance = delegate(string name) {
Console.WriteLine(name);
};
Del2 delinstance2 = delegate (string name) {
Console.WriteLine(name);
return "我是匿名方式定义委托!";
};
//Del delinstance2 = Notify_;
}
//第四种方法:C# 3.0语法中,及更高版本中,还有可以使用lambda,声明实例化委托
public void TestDemo4()
{
//接受一个类似的委托,匿名方式定义一个委托
Del delinstance = name => {
Console.WriteLine(name);
};
Del2 delinstance2 = name => {
Console.WriteLine(name);
return "要求有返回值";
};
var res=delinstance2("我是lambda方式,声明实例化,带返回值的");
Console.WriteLine(res);
//Del delinstance2 = Notify_;
}
}
}
出处如连接。
第二:什么是Ac'ti'o'n?
继承自delegate,本质就是一个特殊的委托,即一个参数名,无返回值特殊签名的委托,
https://docs.microsoft.com/zh-cn/dotnet/api/system.action-1?view=netcore-3.1
对应的action类型声明之后的赋值,有三种
常规,匿名,lambda
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TaskDemo
{
class ActionDemo
{
//https://docs.microsoft.com/zh-cn/dotnet/api/system.action-1?view=netcore-3.1
//封装一个方法,该方法只有一个参数且不返回值。
public delegate void Action<in T>(T obj);
//简单理解是某种特定类型的委托,即一个参数,无返回值的委托,不用单独声明如上,可直接使用:
//public delegate void Action<in T>(T obj);
public void TestDelegate() {
//输出数组内容,以前的方式,当作复习委托
List<string> names = new List<string>();
names.Add("张三");
names.Add("李四");
//参数明显是需要一个Action类型,即特定委托
names.ForEach(delegate (string name)
{
Console.WriteLine(name);
});
//必须是一个带一个参数,无返回值的函数签名,
//因为里面就是接收一个Action委托
names.ForEach(Notify);
}
public void Notify(string name) {
Console.WriteLine("测试");
}
//!!!!!!!!!!这里重点是用Action非常简洁,用来声明特定类型的委托
public void TestAction() {
//第二种方式
Action<string> actionDel = DemoAction;
//第三种方式:
Action<string> actionDel2 = delegate (string name) { };
Action<string> actionDel3 = name => {
};
}
public void DemoAction(string name) {
}
}
}
最后,最后,万丈高楼平地起,夯实基础,继续总结学习,进阶提高各种知识,技巧,