C# 空条件运算符应该一直使用到什么时候?。ToString()?.Trim()等

C# 空条件运算符应该一直使用到什么时候?。ToString()?.Trim()等,c#,.net,operators,null-conditional-operator,C#,.net,Operators,Null Conditional Operator,我对空条件运算符有一些误解?。机制 获取字符串变量长度的示例 object variable = null; int? Length = variable?.ToString()?.Trim()?.Length; 我们应该在需要测试的对象成员的所有级联属性中使用?。运算符吗? 变量对象为null,因此使用null条件运算符进行的测试应仅针对ToString()方法或ToString()的级联成员 这个 或 我认为如果ToString为null,则不需要在它之后测试下一个成员。好的,null条件

我对空条件运算符有一些误解?。机制

获取字符串变量长度的示例

object variable = null;
int? Length = variable?.ToString()?.Trim()?.Length;
我们应该在需要测试的对象成员的所有级联属性中使用
?。
运算符吗?
变量对象为null,因此使用null条件运算符进行的测试应仅针对
ToString()
方法或
ToString()的级联成员

这个


我认为如果
ToString
为null,则不需要在它之后测试下一个成员。

好的,null条件运算符返回
null
或某个
;因为
int
是一个
struct
,所以您不能将

// Doesn't compile. What is Length when variable == null?
int Length = variable?.ToString()?.Trim()?.Length;
但是使用
Nullable

或者将
null
转换为合理的
int

// in case variable is null let Length be -1
int Length = variable?.ToString()?.Trim()?.Length ?? -1;
由于
null.ToString()
引发异常,因此
变量?中的
。ToString()
是必需的;如果我们假设
ToString()
Trim()
从不返回
null
,那么所有其他
?。
都是可选的

  • 如果
    变量
    ,则
    ?。
    将立即返回
  • 如果
    变量
    不是
    null
    ,则
    .ToString()
    .Trim()
    都不会返回
    null
    ,并且检查
    ?。
    是多余的
  • 所以你可以把

    int? Length = variable?.ToString().Trim().Length;
    


    空条件运算符只是空检查的语法糖。因此,以下两种代码相似:

    object variable = null;
    int? Length = variable?.ToString()?.Trim()?.Length;
    
    VS:

    因此,根据成员是否可以返回
    null
    -例如
    ToString
    可以,而
    Trim
    不可以-您可能需要使用
    检查它


    在您的示例中,您可以省略对
    Trim
    的检查,但对
    ToString

    int?长度=…
    ,请注意
    整数长度=??0;a)您可以自己测试。b) 您只需要
    变量?
    一个(假设
    ToString
    从不返回
    null
    ,这是一个非常安全的赌注)。这取决于您调用的成员。数据是否可以为空?例如,
    Trim
    从不返回
    null
    ToString
    但是可以。它不适用于ToString()。这是例如,但可能您有图像或任何您需要来自它的许多嵌套成员的东西。如果该方法不能返回
    null
    ,那么您不需要在它后面加
    。规则就这么简单。
    // in case variable is null let Length be -1
    int Length = variable?.ToString()?.Trim()?.Length ?? -1;
    
    int? Length = variable?.ToString().Trim().Length;
    
    int Length = variable?.ToString().Trim().Length ?? -1; 
    
    object variable = null;
    int? Length = variable?.ToString()?.Trim()?.Length;
    
    object variable = null;
    int? Length;
    if(variable != null)
    {
        var a = variable.ToString()?;
        if(a != null)
        {
            var result = a.Trim();
            if(result != null)
                Length = result.Length;
        }
    }