.NET-16-委托|匿名方法和Lambda表达式|泛型委托
委托
委托是一种数据类型
委托可以把方法当做参数传递
class Program
{
static void Main(string[] args)
{
#region 无参数无返回值得委托使用
//委托是一种数据类型,像类一样
//类的定义用class,委托的定义用delegate
//委托的意义就是把变化的代码给封装起来,在使用的时候动态的传递使用
//类的使用直接new个对象
Person p = new Person();
//委托的使用也是直接创建对象,把对应的无返回值无参数的方法M1当做入参传入
//2.委托使用第二部,创建委托的对象
M1Delegate md = new M1Delegate(M1);
//3.委托使用第三部,调用委托的时候就相当于调用发委托保存的对象
//简写为
md();
//全写为
md.Invoke();
Console.ReadKey();
//类可以有字段属性方法等
//委托是用来存储方法的
#endregion 无参数无返回值得委托使用
}
/// <summary>
/// 定义一个无参数无返回值得方法
/// 用来传入委托
/// </summary>
static void M1()
{
Console.WriteLine("我是一个无参数无返回值的方法M1");
}
}
/// <summary>
/// 定义一个类
/// </summary>
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
/// <summary>
/// 在定义委托的时候
/// 要明确该委托是否有返回值,入参列表(入参的数量,参数的类型)
///
/// 定义一个委托,该委托无返回值,无参数
/// 1.委托使用第一步,定义委托
/// </summary>
/// <param name="?"></param>
/// <returns></returns>
public delegate void M1Delegate();
例如,有一个方法ChangeStrings(string[] strs);在这个方法里面需要对传入的字符串数组进行操作,然后输出改变之后的字符串数组
但是现在有不同的需求,1.在每个字符串两边增加"☆"
2.把字符串中所有的英文转换成大写
在使用为拖实现的时候可以定义两个方法,一个用来增加"☆",一个用来转换成大写字母
定义一个委托,根据不同的需求传入不同的方法来执行字符串的修改
如些截图,先定义一个委托,然后对方法ChangeStrings做如下修改
调用方法ChangeStrings方式如下
class Program
{
static void Main(string[] args)
{
#region 无参数无返回值得委托使用
////委托是一种数据类型,像类一样
////类的定义用class,委托的定义用delegate
////委托的意义就是把变化的代码给封装起来,在使用的时候动态的传递使用
////类的使用直接new个对象
//Person p = new Person();
////委托的使用也是直接创建对象,把对应的无返回值无参数的方法M1当做入参传入
////2.委托使用第二部,创建委托的对象
//M1Delegate md = new M1Delegate(M1);
////3.委托使用第三部,调用委托的时候就相当于调用发委托保存的对象
////简写为
//md();
////全写为
//md.Invoke();
//Console.ReadKey();
////类可以有字段属性方法等
////委托是用来存储方法的
#endregion 无参数无返回值得委托使用
#region 使用委托隐藏邮箱
////隐藏邮箱,邮箱名称有几位替换成几个*
////这里是直接全部替换成了3个*,想要几个字符替换成几个*需要穿委托参数
//string str = "邮箱[email protected],邮箱[email protected],邮箱[email protected]";
////禁止匹配汉字
////str = Regex.Replace(str, @"\w+(@\w+.\w+)", "***$1", RegexOptions.ECMAScript);
////使用委托,邮箱名称有多长就用几个*替换
//str = Regex.Replace(str, @"(\w+)(@\w+.\w+)", Repl, RegexOptions.ECMAScript);
//Console.WriteLine(str);
//Console.ReadKey();
#endregion 使用委托隐藏邮箱
#region 匿名方法
//如果一个方法只使用一次,之后就不在使用
//如下定义了三个委托:无参数无返回值,有参数无返回值,有参数有返回值
////匿名方法不是直接定义的,而是在给委托赋值的时候,直接定义一个没有名称的方法,只有方法体
////正常使用的方式是这样的
//M1Delegate md1 = new M1Delegate(M1);
////或者
//M1Delegate md2 = M1;
////匿名方法使用的凡是如下,使用关键字delegate()来定义匿名函数
//M1Delegate md = delegate()
//{
// Console.WriteLine("这里是一个无参数无返回值得匿名方法");
//};
//md();
////有参数无返回值的匿名方法
//M2Delegate m2d = delegate(string str)
//{
// Console.WriteLine("{0},早上好", str);
//};
//m2d("小硕硕");
////有参数有返回值的匿名方法
//M3Delegate m3d = delegate(int n1, int n2)
//{
// return n1 + n2;
//};
//int result = m3d(10, 13);
//Console.WriteLine(result);
//Console.ReadKey();
#endregion 匿名方法
#region lambda表达式代替匿名方法
////无参数无返回值
//M1Delegate m1d = () => { Console.WriteLine("Lambda表达式"); };
//m1d();
////有参数无返回值
////可以简写为
//M2Delegate m2d = m => { Console.WriteLine("{0},hahahhaha", m); };
//m2d("你好");
////或者规范的写为
//M2Delegate m2d1 = (m) => { Console.WriteLine("{0},hahahhaha", m); };
//m2d1("你好");
////有参数有返回值
////lambda表达式是不需要传递参类型的,应为委托已经限定了参数的类型
//M3Delegate m3d = (n1, n2) =>
//{
// Console.WriteLine("Lambda表达式不需要传递参数类型");
// return n1 + n2;
//};
//int result = m3d(10, 20);
//Console.WriteLine(result);
////可变参数
//M4Delegate m4d = (arr) =>
//{
// return arr.Sum();
//};
//int r = m4d(1, 2, 34, 5, 6, 7);
//Console.WriteLine(r);
//Console.ReadKey();
#endregion lambda表达式代替匿名方法
#region 泛型委托
//系统已经封装好了一些委托,在日常使用中已经足够使用
//Action:无参数无返回值的委托
//Action泛型:有参数没有返回值的泛型委托,有16个重载,最多可以传递16个泛型参数
//Func:没有非泛型版本的,只有一个泛型版本的,一共有17个重载,每个重载都有返回值,但是入参从0个入参到16个泛型入参
//无参数无返回值委托
Action acti = new Action(M1);
acti();
//有参数无返回值得泛型委托
Action<string> aa = (m) => { Console.WriteLine(m); };
aa("你好啊");
//有返回值得泛型委托
Func<int, int, int> fun = new Func<int, int, int>(M3);
int r = fun(10, 20);
Console.WriteLine(r);
Console.ReadKey();
#endregion 泛型委托
}
/// <summary>
/// 用来操作邮箱匹配的规则
/// </summary>
/// <param name="mat"></param>
/// <returns></returns>
static string Repl(Match mat)
{
string uid = mat.Groups[1].Value;
string othere = mat.Groups[2].Value;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < uid.Length; i++)
{
sb.Append("*");
}
return sb.ToString() + othere;
}
/// <summary>
/// 定义一个无参数无返回值得方法
/// 用来传入委托
/// </summary>
static void M1()
{
Console.WriteLine("我是一个无参数无返回值的方法M1");
}
static void M2(string str)
{
Console.WriteLine(str);
}
static int M3(int n1, int n2)
{
return n1 + n2;
}
}
/// <summary>
/// 在定义委托的时候
/// 要明确该委托是否有返回值,入参列表(入参的数量,参数的类型)
///
/// 定义一个委托,该委托无返回值,无参数
/// 1.委托使用第一步,定义委托
/// </summary>
/// <param name="?"></param>
/// <returns></returns>
public delegate void M1Delegate();
/// <summary>
/// 有参数无返回值的委托
/// </summary>
/// <param name="str"></param>
public delegate void M2Delegate(string str);
/// <summary>
/// 有参数有返回值得委托
/// </summary>
/// <param name="n1"></param>
/// <param name="n2"></param>
/// <returns></returns>
public delegate int M3Delegate(int n1, int n2);
/// <summary>
/// 可变参数
/// </summary>
/// <param name="?"></param>
/// <returns></returns>
public delegate int M4Delegate(params int[] arr);