C#里=>的两种用法

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

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

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

// 声明一个函数指针的对象, 也就是委托, 其函数签名为string f(Person)
Func nameProjection = p => p.Name;

// 上面这句, 等同于:
Func nameProjection = delegate (Person p) { return p.Name; };

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

namespace System
{
    // Summary:
    //     Encapsulates a method that has one parameter and returns a value of the type
    public delegate TResult Func(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

你可能感兴趣的:(c#,开发语言)