📜  对象上的 C# 内联问号 - C# (1)

📅  最后修改于: 2023-12-03 14:53:40.303000             🧑  作者: Mango

对象上的 C# 内联问号 - C#

在 C# 8.0 中引入了一种新的特性,称为对象上的内联问号。该特性可以在访问可空类型的属性或字段时,使用简洁的语法来避免繁琐的 null 检查。

语法

使用内联问号的基本语法如下:

var result = obj?.Property;

在上面的语法中,“obj”是一个对象,而“Property”是存在于该对象上的属性。如果该属性的类型是可空类型,则通过在属性名称后使用问号符“?”,可以避免需要显式使用 null 检查的繁琐代码。

您也可以使用内联问号来访问对象上的方法:

var result = obj?.Method();

在上述示例中,“Method”是目标对象上存在的方法。如果该方法返回 null,则您无需编写显式的 null 检查代码。

示例

以下示例演示了内联问号的用法:

class Person
{
    public string? FirstName { get; set; }
    public string? LastName { get; set; }
    public int? Age { get; set; }

    public string GetFullName() => $"{FirstName} {LastName}";

    public string GetAgeText()
    {
        if (Age == null)
        {
            return "Unknown";
        }

        return $"{Age} years old";
    }
}

class Program
{
    static void Main(string[] args)
    {
        Person person = null;

        // 通常情况下,需要使用 null 检查
        if (person != null && person.FirstName != null && person.LastName != null)
        {
            Console.WriteLine(person.GetFullName());
        }
        else
        {
            Console.WriteLine("Name unknown.");
        }

        // 使用内联问号,避免繁琐的 null 检查
        Console.WriteLine(person?.GetFullName() ?? "Name unknown.");

        // 访问可空类型的属性时使用内联问号
        Console.WriteLine($"Age: {person?.Age?.ToString() ?? "Unknown"}");

        // 在访问方法时使用内联问号
        Console.WriteLine(person?.GetAgeText() ?? "Age unknown.");
    }
}

在上面的示例中,我们创建了一个名为“Person”的类,并将其存储在变量“person”中。然后,我们使用内联问号避免了繁琐的 null 检查,通过调用“GetFullName”方法来获取 person 对象上的名称。

注意事项
  • 内联问号只适用于可空类型。如果您尝试使用它来访问非空类型,会出现编译时错误。
  • 您无法通过内联问号来知道为什么目标对象为 null。它只是一个简化语法,可以减少 null 检查的冗余代码。
  • 当访问对象的多个属性或方法时,您可能需要使用组合操作符“.”和“?。”。这可能会使代码稍微难以阅读,应该遵循“保持简单”的规则。
结论

对象上的 C# 内联问号是一种便捷的语法特性,可用于简化访问可空类型的属性或方法时的 null 检查。使用内联问号可以使代码更易于阅读和维护,减少冗余的 null 检查代码。