当前位置:   article > 正文

C#里=>的两种用法_c# =>

c# =>

C#里的=>有两种用法:

用于Lambda表达式里,此时的=>被称为lambda operator
用于expression-bodied member

第一种用法
第一种用法,比较好理解,其实就是Lambda表达式的写法,在C# 3到C# 5版本间,=>只有此种用法。此时的=>C++的lambda表达式里的->类似,举个例子:

  1. // 声明一个函数指针的对象, 也就是委托, 其函数签名为string f(Person)
  2. Func<Person, string> nameProjection = p => p.Name;
  3. // 上面这句, 等同于:
  4. Func<Person, string> nameProjection = delegate (Person p) { return p.Name; };

注意这里的Func<T, TResult>,最后面的代表函数的返回类型,前面的代表函数的参数,Func只是.NET提供的委托模板:

  1. namespace System
  2. {
  3. // Summary:
  4. // Encapsulates a method that has one parameter and returns a value of the type
  5. public delegate TResult Func<in T, out TResult>(T arg);
  6. }

第二种用法
在C# 6的版本里,=>开始用于expression-bodied members,代码如下:

public int MaxHealth1 => x ? y:z;

而这种语法,是一种Syntax Sugar,上面的代码等同于下面的:

  1. public int MaxHealth1
  2. {
  3. get
  4. {
  5. return x ? y:z;
  6. }
  7. }

所以,上面的MathHealth1和MathHealth2的区别,其实就是C#里Property和Field的区别:

MaxHealth1是一个Property,设置了getter,每次访问该值的时候,都会调用x?y:z表达式
MathHeath2是一个Field,它的表达式只会在其初始化时计算一次
其实应该说的很清楚了,再举个例子:

  1. class Program
  2. {
  3. public class A
  4. {
  5. public static int x;//默认初始化为0
  6. public int X1 => x;
  7. public int X2 = x;
  8. }
  9. static void Main()
  10. {
  11. Console.WriteLine(A.x);// 0
  12. A a = new A();
  13. Console.WriteLine(a.X1);// 0
  14. Console.WriteLine(a.X2);// 0
  15. A.x = 5;
  16. Console.WriteLine(a.X1);// 5
  17. Console.WriteLine(a.X2);// 0
  18. A.x = 10;
  19. Console.WriteLine(a.X1);// 10
  20. Console.WriteLine(a.X2);// 0
  21. }
  22. }

可以看到,每次去取X1的值的时候,都会执行return x;这个表达式,所以上面的问题解决了。
————————————————
版权声明:本文为CSDN博主「弹吉他的小刘鸭」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/alexhu2010q/article/details/118439345

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/115688
推荐阅读
相关标签
  

闽ICP备14008679号