《C# in depth》第6章C#6.0中的更改(十四)——表达式体

发布时间 2023-04-26 14:05:58作者: GroundSoft

表达式体成员是一种在C# 6及以上版本中引入的语法。它允许开发人员使用Lambda表达式来简化方法或属性的定义。

在使用表达式体成员时,可以将方法或属性的实现写在一个Lambda表达式中,然后直接返回其计算结果。例如,下面是一个使用表达式体成员定义的简单属性:

public class Person
{
    private string name;

    public string Name
    {
        get => name;
        set => name = value ?? throw new ArgumentNullException(nameof(value));
    }
}

在这个例子中,Name属性的get和set方法都被重写为Lambda表达式。get => name表示当获取属性值时,直接返回name字段;set => name = value ?? throw new ArgumentNullException(nameof(value))表示当设置属性值时,先判断传入的值是否为空,如果为空则抛出一个异常,否则将值赋给name字段。

需要注意的是,表达式体成员只适用于简单的、可以在一行代码中完成的方法或属性。如果方法或属性的实现过于复杂,则应该使用传统的代码块形式来定义。

表达式体的经典应用场景是简化属性的定义。下面是一个代码示例,展示如何使用表达式体成员来简化C#属性的定义:

public class Circle
{
    private double radius;

    // Traditional property definition
    public double Area
    {
        get
        {
            return Math.PI * radius * radius;
        }
    }

    // Property definition using expression-bodied member syntax
    public double Perimeter => 2 * Math.PI * radius;
}

在这个例子中,我们定义了一个Circle类,包含两个计算属性:AreaPerimeter。其中,Area属性使用传统的方法定义方式,而Perimeter属性则使用表达式体成员。通过使用表达式体成员,可以将属性的定义简化为一行代码。

需要注意的是,表达式体还可用于简化方法的定义,例如:

public class Calculator
{
    public int Add(int a, int b) => a + b;

    public bool IsPrime(int n)
    {
        if (n < 2) return false;
        for (int i = 2; i <= Math.Sqrt(n); i++)
        {
            if (n % i == 0) return false;
        }
        return true;
    }
}

在上面的示例中,Add方法和IsPrime方法都使用了表达式体的语法来简化方法的定义。