|
|
1
217
我们考虑过增加一个新的操作吗?“到具有您想要的语义的语言。(现在已经添加了,见下文)也就是说
编译器会为您生成所有的短路检查。 它没有成为C 4的酒吧。也许是对未来语言的假设版本。
更新(2014):
这个
更新(2015年7月):
Visual Studio 2015已发布,并随附支持
null-conditional operators
|
|
|
2
27
我受到这个问题的启发,试图找出如何使用表达式树使用更简单/更漂亮的语法来完成这种深度的空检查。虽然我同意这些答案 可以 如果您经常需要访问层次结构深处的实例,那么这是一个糟糕的设计,我也认为在某些情况下,例如数据表示,它可能非常有用。 所以我创建了一个扩展方法,它允许您编写:
如果表达式的任何部分都不为空,则返回浆果。如果遇到空值,则返回空值。不过,还有一些警告,在当前版本中,它只能使用简单的成员访问,并且只能在.NET Framework 4上工作,因为它使用了在v4中是新的memberExpression.update方法。这是ifnotnull扩展方法的代码:
它的工作原理是检查表示表达式的表达式树,并逐个评估各个部分;每次检查结果是否为空。 我确信这可以扩展,以便支持除memberExpression之外的其他表达式。将此代码视为概念代码的证明,请记住,使用它会导致性能损失(在许多情况下,这可能不重要,但不要在紧密循环中使用它:-) |
|
3
23
我发现这个扩展对于深层嵌套场景非常有用。
这是我从C和T-SQL中的空合并操作符中派生出来的一个想法。好的是,返回类型始终是内部属性的返回类型。 这样就可以做到:
…或上述的细微变化:
这不是我所知道的最好的语法,但它确实有效。 |
|
4
16
除了违反了德米特定律之外,正如梅尔达德阿夫沙里已经指出的,在我看来,决策逻辑需要“深度空检查”。 当您希望用默认值替换空对象时,这种情况最常见。在这种情况下,您应该考虑实现 Null Object Pattern . 它充当一个真实对象的代理,提供默认值和“非操作”方法。 |
|
|
5
10
更新:
从Visual Studio 2015开始,C编译器(语言版本6)现在可以识别
除了重新设计代码,比如
this deleted answer
建议,
另一个(尽管很糟糕)选择是使用
我个人不会这样做,原因如下:
这几乎肯定是一种语言特性(在C 6中以
因为没有办法简单地通过
(注:代码已编辑。)
你很快就会发现这种方法有几个问题。首先,您不会得到任何类型的安全性和简单类型属性值的可能装箱。第二,你可以回来
我要么留下来:
或者按照上面的答案去做。
附笔。:
回到我写这个答案的时候,我显然没有考虑lambda函数的表达式树;请参见@driis'answer以获得这个方向的解决方案。它还基于一种反射,因此可能不如一个简单的解决方案好用。(
|
|
|
6
5
虽然德里斯的回答很有趣,但我认为从性能上看,这有点太贵了。我宁愿为每个属性路径编译一个lambda,缓存它,然后重新调用许多类型,而不是编译许多委托。 下面的nullcoalesce就是这样做的,它返回一个带有空检查的新lambda表达式,并在任何路径为空时返回默认值(tresult)。 例子:
将返回表达式
代码:
|
|
|
7
4
一种选择是使用空对象模式,因此,当您没有蛋糕时,您有一个空蛋糕,它返回一个nullfosting等。抱歉,我不太擅长解释这个问题,但其他人是,请参见 |
|
|
8
3
我也经常希望有一个更简单的语法!当您的方法返回值可能为空时,它会变得特别难看,因为您需要额外的变量(例如:
然而,这里有一个我使用的相当不错的替代方法:创建一个空的安全链帮助器方法。我意识到这与上面的@john答案非常相似(用
实现方法如下:
我还创建了几个重载(带有2到6个参数),以及允许链以值类型或默认值结尾的重载。这对我来说真的很管用! |
|
|
9
1
有 Maybe codeplex project 那工具 使用lambdas表示c中的深层表达式的maybe或ifnotnull# 使用实例:
链接 was suggested 在类似的问题中 How to check for nulls in a deep lambda expression? |
|
|
10
1
如中建议的 John Leidegren 的 answer 解决此问题的一种方法是使用扩展方法和委托。使用它们可能看起来像这样:
实现很混乱,因为您需要让它适用于值类型、引用类型和可以为空的值类型。您可以在中找到完整的实现 Timwi 的 answer 到 What is the proper way to check for null values? . |
|
|
11
1
或者您可以使用反射:) 反射函数:
用途:
我的情况(在反射函数中返回dbnull.value而不是null):
|
|
12
1
试试这个代码:
|
|
|
13
0
我昨晚发了这个帖子,然后一个朋友向我指出了这个问题。希望它有帮助。然后您可以这样做:
阅读 full blog post here . 同样的朋友也建议你 watch this . |
|
|
14
0
我稍微修改了代码 here 要使问题得到解决,请执行以下操作:
是的,这可能是 不是最佳解决方案 由于Try/Catch性能影响,但它可以工作:> 用途:
|
|
15
0
如果需要实现此目标,请执行以下操作: 用法
或
帮助程序类实现
|
|
16
-3
我喜欢Objective-C采用的方法: “Objective-C语言采用了另一种解决此问题的方法,不在nil上调用方法,而是为所有此类调用返回nil。”
|
|
|
A B · C#Excel自动调整列避免长文本时出错 1 年前 |
|
|
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 1 年前 |
|
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 1 年前 |
|
|
Sei · Avalonia/WPF将路由器传递到控制模板 1 年前 |