【问题标题】:C# nullable check optimization [duplicate]C#可为空检查优化[重复]
【发布时间】:2021-05-23 21:41:27
【问题描述】:

谁能告诉我如何优化下面的代码。

if (report != null && 
    report.Breakdown != null &&
    report.Breakdown.ContainsKey(reportName.ToString()) &&
    report.Breakdown[reportName.ToString()].Result != null
    )

【问题讨论】:

  • 如何优化?表现?更短?还有什么?
  • 您使用的是哪个版本的 C#? C# 6 的空条件运算符可以在这里提供帮助。
  • 在您的报告类型定义上创建一个 IsNull() 操作,该操作对报告执行所有空值检查。然后你就可以调用它了。
  • @TheLethalCoder,是的,我希望它更短。
  • @JonSkeet 我正在使用 c# 6

标签: c# .net optimization nullable


【解决方案1】:

正如其他人所提到的,您可以使用?. 运算符来组合您的一些空检查。但是,如果您在优化性能之后,您应该避免双重字典查找(ContainsKey 和索引访问),而是使用 TryGetValue

MyType match = null;   // adjust type
if (report?.Breakdown?.TryGetValue(reportName.ToString(), out match) == true &&
    match?.Result != null)
{
    // ...
}

【讨论】:

  • 不要做 "== true" ;-)
  • @Lucero:在这种情况下你需要这样做,因为结果是bool?;否则编译器会报语法错误。
  • @Douglas 你可以使用空合并运算符??,不过都可以。
【解决方案2】:

Ayman 的答案可能是您对 C# 6 所能做的最好的,因为在此之前,如果所有这些对象都可以为空,那么您所拥有的几乎是您能做的最好的。

进一步优化这一点的唯一方法是在调用代码之前检查这些对象是否为空,或者更好地证明您的平台,因此如果值为空,则甚至不应该首先调用此特定函数.

如果您只是从字典中获取值,但是您也可以使用 null 合并运算符 '??' 进行简化

例子:

MyDictionary['Key'] ?? "Default Value";

因此,如果该条目的值为 null,您将获得默认值。

所以如果这只是一个获取,我就去

var foo = 
     report != null && 
     report.Breakdown != null &&
     report.Breakdown.ContainsKey(reportName.ToString()) ?
     report.Breakdown[reportName.ToString()].Result ?? "Default" :
     "Default";

但是,如果您实际上是在循环中做事,那么是的,您几乎可以做到最好。

【讨论】:

    【解决方案3】:

    对于 C# 6 及更高版本,您可以这样做:

    if (report?.Breakdown?.ContainsKey(reportName.ToString()) == true &&
        report.Breakdown[reportName.ToString()].Result != null)
    

    【讨论】:

      【解决方案4】:

      您可以使用空条件运算符,但只能在 C# 6 上使用

      if ( report?.Breakdown?.ContainsKey(reportName.ToString()) == true &&
           report.Breakdown[reportName.ToString()].Result != null )
      

      【讨论】:

      • 给出编译时错误:运算符 && 不能应用于 bool 和 bool 类型的操作数?
      • 抱歉,已经修复了
      【解决方案5】:

      你可以试试下面吗?也可能更好地将其发送到方法。

      // unless report name is already a string
      string reportNameString = reportName.ToString();
      if ( report?.Breakdown?.ContainsKey(reportNameString) &&
           report.Breakdown[reportNameString].Result != null )
      {
          // rest of the code
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-29
        • 2017-04-21
        • 1970-01-01
        • 2018-10-10
        • 2022-07-22
        • 2015-07-19
        相关资源
        最近更新 更多