【问题标题】:Null Conditional Operator should used until what? ?.ToString()?.Trim() etc [duplicate]空条件运算符应该使用到什么时候? ?.ToString()?.Trim() 等 [重复]
【发布时间】:2020-01-24 11:27:53
【问题描述】:

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

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

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

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

这个

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

?.ToString().Trim().Length 

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

【问题讨论】:

  • int? Length =...,请注意?int Length = ... ?? 0;
  • a) 你可以自己测试一下。 b) 你只需要variable? 一个(假设ToString 永远不会返回null,这是一个相当安全的选择)。
  • 这取决于您呼叫的成员。可以为空吗?例如。 Trim从不返回nullToString但是可以
  • 它不适用于 ToString()。这是例如,但也许你有 Image 或任何你需要许多嵌套成员的东西。
  • 如果方法不能返回null,那么后面不需要?。规则就这么简单。

标签: c# .net operators null-conditional-operator


【解决方案1】:

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

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

VS:

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

【讨论】:

    【解决方案2】:

    好吧,空条件运算符返回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() 抛出异常,那么variable?.ToString() 中的?.强制;如果我们假设ToString()Trim() 永远不会返回null,那么所有其他?. 都是可选

    1. 如果variablenull 那么?. 将立即返回null
    2. 如果variable 不是null.ToString().Trim() 都不会返回null 并且检查?. 是多余的。

    所以你可以放任何一个

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

    或者

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

    【讨论】:

      猜你喜欢
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      相关资源
      最近更新 更多