【问题标题】:Null behaviour as in t-sql [duplicate]t-sql 中的空行为 [重复]
【发布时间】:2012-11-28 03:00:01
【问题描述】:

可能重复:
C# if-null-then-null expression

我在 C# 中缺少的是对空引用的处理,就像在 sql server 中一样:

var a = SomeObject.Property1.Property2.Property3.Property4

如果任何属性为空,那么我会得到 NullReferenceException。有时如果将a 设置为null 且没有错误会更方便,我可以简单地检查一下。

同样,

var a = SomeList.FirstOrDefault(...).Select(...)

如果序列不包含任何元素而不是将a 设置为null,这也会引发异常。

所以我的问题是:有没有短而好的方法(可能使用扩展?)在这些场景中实现类似 sql 的行为?

【问题讨论】:

  • 我自己以前也想过这个问题,我确信有一种扩展方式可以做到这一点。
  • 我不确定您的情况是否可以接受,但您可以定义“空对象”并使用DefaultIfEmpty 而不是FirstOrDefault
  • @Andras:你为什么说差不多?好像在问同样的事情不是吗?
  • @Chris - 实际上经过反思肯定不是!

标签: c#


【解决方案1】:

这仅适用于静态属性,因为未实例化的对象为空。扩展方法也无法做到这一点,因为它们将扩展对象的实例作为第一个参数。

这样做的丑陋方式......

var a;
try {
   a = SomeObject.Property1.Property2.Property3.Property4;
} catch (NullReferenceException) { }

【讨论】:

  • 扩展方法的第一个参数好像可以为null并且没有错误
  • @ren 扩展方法的第一个声明参数是被扩展类的实例。扩展不需要声明任何进一步的参数。在此处查看有关扩展的一般信息:msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx
  • 我的意思是this
  • @ren 我玩过那个代码......我以前从未见过那个网站,非常方便。除非您想编写一个扩展来替换层次结构中每个对象的每个属性,否则这些扩展并不能真正帮助您。
猜你喜欢
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 2011-01-28
  • 2012-01-02
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多