使用条件委托 ?. 调用 (IDE1005)

使用条件委托 ?. 调用

    • 简介
    • 概述
    • CSHARP_STYLE_CONDITIONAL_DELEGATE_CALL
    • 示例
    • Null条件运算符

简介

属性 - 值
规则 ID - IDE1005
标题 - 使用条件委托调用
类别 - Style
Subcategory - 语言规则(NULL 检查首选项)
适用的语言 - C# 6.0+

概述

样式规则涉及在

  • 调用 Lambda 表达式时使用 Null 条件运算符 (?.)
  • 而非执行 NULL 检查。

CSHARP_STYLE_CONDITIONAL_DELEGATE_CALL

属性 - 值
选项名称 - csharp_style_conditional_delegate_call
选项值

  • true - 在调用 Lambda 表达式时首选使用条件合并运算符 (?.),而非执行 NULL 检查

  • false - 在调用 Lambda 表达式之前执行 NULL 检查为首选项,而非使用条件合并运算符 (?.)
    默认选项值 true

示例

C#

// csharp_style_conditional_delegate_call = true
func?.Invoke(args);

// csharp_style_conditional_delegate_call = false
if (func != null) {
      func(args); }

Null条件运算符

Null 条件运算符 ?. 和 ?[]
Null 条件运算符在 C# 6 及更高版本中可用,仅当操作数的计算结果为非 null 时,null 条件运算符才会将成员访问 ?. 或元素访问 ?[] 运算应用于其操作数;否则,将返回 null。 即:

如果 a 的计算结果为 null,则 a?.x 或 a?[x] 的结果为 null。

如果 a 的计算结果为非 null,则 a?.x 或 a?[x] 的结果将分别与 a.x 或 a[x] 的结果相同。

备注

如果 a.x 或 a[x] 引发异常,则 a?.x 或 a?[x] 将对非 null a 引发相同的异常。 例如,如果 a 为非 null
数组实例且 x 在 a的边界之外,则 a?[x] 将引发 IndexOutOfRangeException。

NULL 条件运算符采用最小化求值策略。 也就是说,如果条件成员或元素访问运算链中的一个运算返回 null,则链的其余部分不会执行。 在以下示例中,如果 A 的计算结果为 null,则不会计算 B;如果 A 或 B 的计算结果为 null,则不会计算 C:

C#

A?.B?.Do(C);
A?.B?[C];

以下示例演示了 ?. 和 ?[] 运算符的用法:

C#

double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum)
{
     
    return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN;
}

var sum1 = SumNumbers(null, 0);
Console.WriteLine(sum1);  // output: NaN

var numberSets = new List<double[]>
{
     
    new[] {
      1.0, 2.0, 3.0 },
    null
};

var sum2 = SumNumbers(numberSets, 0);
Console.WriteLine(sum2);  // output: 6

var sum3 = SumNumbers(numberSets, 1);
Console.WriteLine(sum3);  // output: NaN

前面的示例还使用 Null 合并运算符 ?? 来指定替代表达式,以便在 null 条件运算的结果为 null 时用于计算。

如果 a.x 或 a[x] 是不可为 null 的值类型 T,则 a?.x 或 a?[x] 属于对应的可为 null 的值类型 T?。 如果需要 T 类型的表达式,请将 Null 合并操作符 ?? 应用于 null 条件表达式,如下面的示例所示:

C#

int GetSumOfFirstTwoOrDefault(int[] numbers)
{
     
    if ((numbers?.Length ?? 0) < 2)
    {
        return 0;
    }
    return numbers[0] + numbers[1];
}

Console.WriteLine(GetSumOfFirstTwoOrDefault(null));  
// output: 0
Console.WriteLine(GetSumOfFirstTwoOrDefault(new int[0]));  
// output: 0
Console.WriteLine(GetSumOfFirstTwoOrDefault(new[] {
      3, 4, 5 }));  
// output: 7

在前面的示例中,如果不使用 ?? 运算符,则在 numbers 为 null 时,numbers?.Length < 2 的计算结果为 false。

Null 条件成员访问运算符 ?. 也称为 Elvis 运算符。

你可能感兴趣的:(C#)