问题标签 [null-conditional-operator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
19 回答
137494 浏览

c# - C# 优雅的方法来检查一个属性的属性是否为空

在 C# 中,假设您想在此示例中从 PropertyC 中提取一个值,并且 ObjectA、PropertyA 和 PropertyB 都可以为空。

对象A.PropertyA.PropertyB.PropertyC

如何用最少的代码安全地获得 PropertyC?

现在我会检查:

做更多这样的事情(伪代码)会很好。

使用空合并运算符可能会进一步崩溃。

编辑最初我说我的第二个示例就像 js,但我将其更改为伪代码,因为它被正确指出它在 js 中不起作用。

0 投票
6 回答
5409 浏览

c# - 调用方法时处理空对象

我一直在寻找在调用方法(或方法链)时处理空对象的最佳选择。

检查 if 条件是我们常见的做法:

可以通过使用扩展方法进一步改进:

请注意:我通常忽略!来自我的编程实践。因此,明智的做法是说扩展方法对我来说很好。

但是,当涉及到方法链时,处理变得非常复杂。

您如何认为它可以在 C# 中处理,以便CallMe仅在customObject不为 null时CallMe2调用,并且仅在CallMe返回非 null 对象时调用。

当然我可以使用 If 条件或三元运算符。但是,我想知道 vNext, C#5.0 是否可以提供一些东西。

0 投票
2 回答
107 浏览

c# - 新的 C#/VB – 引入条件中的第一个不对称?

C# 的家伙会原谅我的 VB,但以下应该与这两种语言有关。编辑:它是相关的,但到目前为止没有人注意到 C# 和 VB 评估不同。问题调整。

以前,如果我们有简单的

并想将其重新排列成相反的顺序,我们交换ThenPart()ElsePart()否定了条件(一般来说,通过使用Not(condition))。可以重新安排每个条件。

最近,引入了很棒的空条件运算符。随之而来的是不对称性。您不能再Not(condition)与它们一起使用。还是我忽略了什么?(这就是问题。)

尝试在此处重新排列 ThenPart()并按ElsePart()相反顺序排列:

诀窍是空值出现在条件中,当然,它不能使用Not. 因此,您不能使用平凡的否定If Not(list?.Count = 0),也不能使用If list?.Count <= 0.

唯一的方法是老式的If list Is Nothing OrElse list.Count = 0 (确切的否定将使用<= 0)(编辑:仅适用于 VB。VB 和 C# 在这里分歧,见下文。)

简单地否定每个运算符的琐碎时代已经一去不复返了(编辑:仅在 VB 中)。还是我忽略了什么?


经过进一步研究:

它看起来在 C# 中你可以安全地做!(list?.Count = 0),在这个发现之后,C# 摆脱了这个问题。这里没有不对称,你可以像以前一样否定。但据我所见,VB 中的不对称性仍然存在,因为nullVisual Basic中的求值类似于 ANSI SQL——空值通过表达式传播。所以在 VB 中,你不能list?.Count > 0If list Is Nothing OrElse list.Count = 0. (这就是我使用“不对称”这个词的原因。)还是我忽略了什么?

0 投票
2 回答
682 浏览

c# - 为什么空条件运算符对 == 和 .Equals() 的行为不同?

我有以下代码,它工作正常:

我想让字符串比较不区分大小写,所以我将其更改为:

现在编译器给了我一个错误:

运算符 && 不能应用于 'bool' 和 'bool?' 类型的操作数?

我可以通过合并为 false 来修复错误

但我很好奇为什么编译器不喜欢第一个空条件语法。

0 投票
4 回答
16806 浏览

c# - C# 安全导航运算符 - 实际发生了什么?

我一直感兴趣地关注 C#6 中添加的安全导航运算符功能。我已经期待了一段时间了。但我发现一些与我预期不同的行为。我意识到我真的不明白它是如何工作的。

鉴于这个类

这是一些使用 new 运算符的代码。

到这里为止,一切都按预期工作。 ?.当左侧不为 null 时正在访问成员,否则返回 null。但这里的事情朝着我没想到的方向发展。

什么?

为什么我可以从我分配给的同一个表达式中得到HasValuei但不能得到i?怎么可能HasValue是空的?

编辑:我真正的问题是关于程序行为,而不是编译错误。我删除了关于编译的额外内容,并将这个问题更狭隘地集中在为什么看似相同的逻辑会返回两个不同的结果。

0 投票
4 回答
2287 浏览

c# - .NET 3.5 / 4.0,VS 2012 / 2013 中的空条件运算符模拟?

在我的代码中,我必须访问调用多个属性获取器的值:

每个属性都可以为空。因此,要访问每个值,我必须使用嵌套的 if 块:

如何改进此代码以减少 if 块的数量?我可以使用任何 lambda 表达式、LINQ、IExpression 等以某种方式将其替换为:

IFoo2 b = GetVal(objB.Prop2.Prop3.Value);

所有 PropX 都有不同的类型,我有数百个这样的属性。我必须使用 .NET 3.5 或至少 .NET 4.0。我不能使用任何更高版本。

重要编辑:

我还必须使用 Visual Studio 2012 和 2013。我不能针对 VS 2015。

0 投票
2 回答
87 浏览

vb.net - 空条件不适用于数据库记录

我正在尝试在 .NET 4.6 中测试新的空条件运算符(使用 VB.Net),但是在从数据库记录的字段中检索空值时它对我不起作用,我不明白为什么. 这是我的代码:

然而,它仍然抛出 System.Data.StrongTypingException。

我究竟做错了什么?

0 投票
2 回答
908 浏览

c# - 在 Dispose 方法中清理类级变量

变量userManagersignInManager都是可以实例化的类级实例成员,也可以为空。

替换它是否安全:

有了这个:

就我个人而言,我没有看到在处理它们之后将变量显式分配给 null 的意义,因为它们不是静态的,据我所知,它没有做任何事情。

0 投票
2 回答
5115 浏览

c# - 带有空条件运算符和等待的 C# 错误

在 C# 中使用新的空条件运算符时,我遇到了一个有趣的 System.NullReferenceException。如果“MyObject”为空,下面的代码会给我一个 NullReferenceException:

我原以为如果“MyObject”为空,则根本不会调用“MyMethod”,还是我误解了空条件运算符的目的?

0 投票
1 回答
344 浏览

c# - 使用空条件运算符 (?.) 可能对 IEnumerable 进行多重枚举

我认为这是来自 resharper 的误报,但我想征求其他人的意见。也许我错过了一些东西。

我在 Resharper 9.2 和 10 中都发现了这种行为。

考虑这个类:

这个方法:

theList.Countforeach触发警告,但既然我做了一个ToList(),这是不可能的,对吧?

thisFooCanBeNull?.SomeList?.ToList()如果我更改,它不会触发警告thisFooCanBeNull.SomeList?.ToList(),但是由于“这个 foo 可以为空”,所以我不想进行更改。

有人看到这段代码有问题吗?