-1

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

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

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

?.我们是否应该在需要测试的对象成员的所有级联属性中使用运算符?
变量对象为空,因此使用空条件运算符进行测试应仅用于方法或?ToString()的级联成员ToString()

这个

?.ToString()?.Trim()?.Length

或者

?.ToString().Trim().Length 

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

4

2 回答 2

0

好吧,空条件运算符返回一个null或一些class;因为intstruct你不能放的

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

但要么使用Nullable<int>

// Now Length can be null if variable is null
int? Length = variable?.ToString()?.Trim()?.Length;

null变成合理的int

// in case variable is null let Length be -1
int Length = variable?.ToString()?.Trim()?.Length ?? -1;

由于null.ToString()throws 异常 then ?.invariable?.ToString()强制性的;如果我们假设并且永远不会返回,那么所有其他?.都是可选的。ToString()Trim()null

  1. if variableis nullthen?.将立即返回null
  2. 如果variable不是null,则两者.ToString().Trim()不会返回null,并且检查?.是多余的。

所以你可以把

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

或者

int Length = variable?.ToString().Trim().Length ?? -1; 
于 2019-09-24T10:56:26.260 回答
0

空条件运算符只是空检查的语法糖。所以下面的两个代码是相似的:

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;
    }
}

因此,取决于成员是否甚至可以返回null- 例如ToString可能而Trim不能 - 您可能必须使用?.

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

于 2019-09-24T10:57:56.153 回答