赞
踩
C#里的=>有两种用法:
用于Lambda表达式里,此时的=>被称为lambda operator
用于expression-bodied member
第一种用法
第一种用法,比较好理解,其实就是Lambda表达式的写法,在C# 3到C# 5版本间,=>只有此种用法。此时的=>C++的lambda表达式里的->类似,举个例子:
- // 声明一个函数指针的对象, 也就是委托, 其函数签名为string f(Person)
- Func<Person, string> nameProjection = p => p.Name;
-
- // 上面这句, 等同于:
- Func<Person, string> nameProjection = delegate (Person p) { return p.Name; };
注意这里的Func<T, TResult>
,最后面的代表函数的返回类型,前面的代表函数的参数,Func只是.NET提供的委托模板:
- namespace System
- {
- // Summary:
- // Encapsulates a method that has one parameter and returns a value of the type
- public delegate TResult Func<in T, out TResult>(T arg);
- }
第二种用法
在C# 6的版本里,=>
开始用于expression-bodied members,代码如下:
public int MaxHealth1 => x ? y:z;
而这种语法,是一种Syntax Sugar,上面的代码等同于下面的:
- public int MaxHealth1
- {
- get
- {
- return x ? y:z;
- }
- }
所以,上面的MathHealth1和MathHealth2的区别,其实就是C#里Property和Field的区别:
MaxHealth1是一个Property,设置了getter,每次访问该值的时候,都会调用x?y:z表达式
MathHeath2是一个Field,它的表达式只会在其初始化时计算一次
其实应该说的很清楚了,再举个例子:
- class Program
- {
- public class A
- {
- public static int x;//默认初始化为0
- public int X1 => x;
- public int X2 = x;
- }
-
-
- static void Main()
- {
- Console.WriteLine(A.x);// 0
-
- A a = new A();
- Console.WriteLine(a.X1);// 0
- Console.WriteLine(a.X2);// 0
-
- A.x = 5;
- Console.WriteLine(a.X1);// 5
- Console.WriteLine(a.X2);// 0
-
- A.x = 10;
- Console.WriteLine(a.X1);// 10
- Console.WriteLine(a.X2);// 0
- }
- }
可以看到,每次去取X1的值的时候,都会执行return x;
这个表达式,所以上面的问题解决了。
————————————————
版权声明:本文为CSDN博主「弹吉他的小刘鸭」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/alexhu2010q/article/details/118439345
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。