问题标签 [null-propagation-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 投票
4 回答
4504 浏览

c# - 空传播运算符和 foreach

阅读了很多关于Null 传播运算符?.的内容,我发现它在以下场景中是否有帮助没有答案。

抛出的代码:

为了使它工作,我必须null在访问values变量之前添加一个检查。

上述代码很可能超出了 Null 传播运算符的设计考虑范围。不过,可以肯定的是,我不得不问。

我的问题:

尝试在循环中访问null集合时,Null 传播运算符是否有用?foreach

0 投票
3 回答
5988 浏览

c# - C# 6.0 中的一元空值检查

我偶然发现了一个有趣的站点,其中解决了 C# 6.0 的一些新(提议的)特性。您可以在此处阅读:Probable C# 6.0 features

我发现特别有趣的是一元空值检查(也称为空值传播运算符?.)。根据该网站,以下声明

包含 monadic null 检查,目前使用以下代码实现:

我的第一眼是,嘿,这里到底写了什么?但是在查看“旧”代码之后,我开始喜欢它。

但是,我也开始收到一些问题,我想问一下。

  • 我假设这个空传播运算符是线程安全的。但这实际上是如何执行的?竞争条件会被删除还是会持续存在?
  • 该运算符将如何处理泛型类型?此外,它将如何处理不受约束的泛型类型?例如,考虑

    如果这里的类型 Y 是用引用类型、不可为空的值类型和可空的值类型来实例化的,那么就没有什么合理的可做(因为我想不出该怎么做,因为我根本不知道该怎么做)。那么是否会返回默认值?还是会抛出错误?

  • 在查看该站点提供的示例(以及我在上面复制的示例)时,我假设空传播运算符的主要好处之一是它只会评估该语句一次。但是(可能是由于我对 CLR 缺乏了解),我很好奇它是如何执行的。
    对我来说,第一次评估(如果 points 等于 null)应该触发扩展方法 FirstOrDefault() 以在 points 不为 null 时触发,然后将返回的类型评估为 null 与否,如果不是,X 将是回来。所以这些实际上是三个评价合二为一?还是我理解错误?这会影响执行速度吗?

换句话说,执行空值检查的旧方法或这个新的可爱运算符会更快吗?一旦 Visual Studio 2015 的下载完成,我将尝试通过执行一些研究来检查这一点……但这需要一点耐心……

对这种新的运算符类型有什么想法吗?它真的仍然是一个提议的,还是我们真的可以期望使用这个新的一元空值检查?

编辑
由于 Matthew Watson 提供了一篇很好的MSDN 文章来讨论这个(以及更多)主题,我很好奇它是否提到了我之前关于无约束泛型的问题以及这个运算符如何处理这个问题。不幸的是,我还没有找到答案。虽然我认为程序员应该尽量避免使用不受约束的泛型,但我仍然可以想象这有时是不可行的。如果是这样的话,是否真的需要重新设计?

0 投票
1 回答
32864 浏览

c# - 为什么我不能在 lambda 表达式中使用空传播运算符?

我经常在我的代码中使用 null 传播运算符,因为它为我提供了更具可读性的代码,特别是在长查询中,我不必对使用的每个类进行 null 检查。

下面的代码抛出一个编译错误,我们不能在 lambda 中使用空传播运算符。

错误 :

错误 CS8072 表达式树 lambda 可能不包含空传播运算符。

如果真的不能做任何其他事情,C# 可以轻松地将上面的代码转换为下面的代码!

我很好奇为什么 C# 什么都不做,只是抛出编译器错误?

0 投票
1 回答
3427 浏览

c# - 使用空传播/空条件运算符时出错

我在 VS 2013 中运行 .NET 4.5 项目。为什么下面的代码有错误?

我在这个MSDN 博客上找到了这段代码。

0 投票
2 回答
1788 浏览

linq - Null 传播 ?.First() 与 .FirstOrDefault()

在使用空传播运算符一段时间后,我偶然发现编写了一个用于选择单个项目的 linq 子句。是否有理由(性能、最佳实践)不使用 ?.First()?

或者

0 投票
3 回答
5130 浏览

c# - C# 6.0 空传播运算符和属性赋值

为了彻底解释,这个问题已经过彻底检查。

我注意到 C# 6.0 中空传播运算符的一个似乎很差的限制,因为您不能针对已传播空的对象调用属性设置器(尽管您可以针对已传播空的对象调用属性获取器) . 正如您将从生成的 IL (我已反映到 C#)中看到的那样,没有什么可以限制使用 null 传播调用属性设置器的能力。

首先,我创建了一个简单的类,它具有 Java 样式的 Get/Set 方法和一个具有公共 getter/setter 访问权限的属性。

我已经在下面的测试类中测试了 null 传播的能力。

赋值的左侧必须是变量、属性或索引器。

然而,您可能会注意到,通过调用设置名称的 Java 方法是SetName(...)有效的,您可能还会注意到获取空传播属性的值也有效。

让我们看一下从这段代码生成的 C#:

请注意,当用于SetName方法时,空传播转换为简单的if语句,而当用于Name属性 getter 时,使用三元运算符来获取Nameor的值null

我在这里注意到的一件事是使用if语句和使用三元运算符之间的行为差​​异:使用 setter 时,使用if语句会起作用,而使用三元运算符则不会。

在此示例中,我同时使用if语句和三元运算符来检查 person 是否null在尝试分配其Name属性之前。该if语句按预期工作;正如预期的那样,使用三元运算符的语句失败

你调用的对象是空的。

在我看来,限制来自于 C# 6.0 将 null 传播转换为if语句或三元表达式的能力。如果它被设计为仅使用if语句,则属性分配将通过空传播工作。

到目前为止,我还没有看到一个令人信服的论点来说明为什么这不应该发生,因此我仍在寻找答案!

0 投票
3 回答
8872 浏览

c# - 操作员 '?' 不能应用于“T”类型的操作数

试图使Feature通用,然后突然编译器说

操作员 '?' 不能应用于“T”类型的操作数

这是代码

可以改用此代码

但我想知道如何修复那个漂亮的 C# 6.0 单线。

0 投票
2 回答
308 浏览

c# - C# 6 null 传播当对象为 null 时设置什么值

在这种情况下,如果myObject为空,Result 的值是多少?

0 投票
2 回答
241 浏览

c# - 方法失败的 C# 6 空条件运算符

以下(C# Interactive)编译但失败了。不知道我错过了什么......

0 投票
4 回答
722 浏览

c# - 如何将 Nullable 运算符与 Null 条件运算符一起使用?

老路

新的方法?