\

In the cone of light, all is fate

【C#】知识补充

弃元

本质上是个占位符,用_表示,它只能被赋值,不能被读取,也不占内存空间,可以理解为:为满足代码的格式要求,用__代替变量占用位置

_ = 1; //代码上赋值了,其实没有赋值
Console.Write(_) //提示上下文不存在名称“_”

通过以上代码可知,_是独立的,它不是一个真的变量,因为内存中没有它,那么它在同一行代码中可以出现多次:

var (year, _, _) = Test.GetCustomDate();

class Test
{
    static public (int, int, int) GetCustomDate()
    {
        //...
        return (2022, 1, 1);
    }
}

上面的函数返回多个值,而如果我们只需要其中一个值,比如年份时,则用弃元的方法,假装有变量接收函数的返回值的后两位。

弃元的应用场景很多,也非常灵活,只要理解了它是一个占位符,知道当一个值我们不需要读取,只需要被接收时就可以使用它,那么就掌握了它。

委托

委托是个类,它的应用本质是将方法作为参数,应用场景之一是在A类中调用一个方法,而方法的具体逻辑在B类中。
基础的委托如下

delegate bool MyMethod(int val);

class A
{
	//只要返回值、参数数量和类型相同,就可以委托,以下就是同一个委托的2个不同实现
	MyMethod std1 = new MyMethod(ImpMethod1);
	//MyMethod std2 = new MyMethod(ImpMethod2);
	
	private bool ImpMethod1(int val)
	{
		return val>0;
	}
	
	private bool ImpMethod2(int val)
	{
		return val<0;
	}
	
	
	//委托作为参数传入其他方法中
	private bool OtherMethod(MyMethod bstd)
	{
		return bstd.Invoke(1);
	}
	
	//调用其他方法时,要确定委托中的参数
	OtherMethod(std1)
	OtherMethod(new MyMethod(ImpMethod2))
	
}

委托推断

MyMethod std1 = ImpMethod1; //可省略 new

简化调用

bstd(1); //省略了Invoke

匿名方法

MyMethod std1 = delegate(int val){ return val > 0 };

Lambda

MyMethod std1 = val=> val > 0 ;

Action、Func

可以避免定义委托,Action是无返回值的委托,Func是有返回值的委托,它们都有0到16个参数可选择

private bool OtherMethod1(Action<int val> act)
{
	//......
}

private bool OtherMethod2(Func<int val,out result> func)
{
	//......
}
高阶函数

将委托作为返回值

//定义一个委托
delegate int Calculate(int a,int b);

//一个返回值为上面委托的函数
Calculate ExCalculate(string c)
{
	switch(c)
	{
		case "+"return (a,b) => a + b;
		case "-" :
			return (a,b) => a - b;
		//......
	}
	
}

//创建变量接收返回的委托
Calculate cal1 = ExCalculate("+");
//使用委托得到计算结果 
int result = cal1(1,2);

Target

可以通过委托的Target获得该委托的实例对象,多播委托时获得的是最后注册的对象

多播委托
delegate int Calculate(int a,int b);
Calculate += A;
Calculate += B;
Calculate += C;

private int A(int a ,int b)
private int B(int a ,int b)
private int C(int a ,int b)
posted @   Ymrt  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示