22

如果 C# 允许 ??= 运算符,那就太好了。我发现自己经常写以下内容:

something = something ?? new Something();

我宁愿这样写:

something ??= new Something();

想法?新的语言扩展总是因其性质而引起争议。

4

7 回答 7

15

其他编程语言,如 Ruby,经常使用它:

something ||= Something.new
于 2009-04-15T14:56:51.557 回答
8

如果“某物”是属性访问器的私有字段,您可以执行以下操作....如果发现该字段为空,这将执行分配。

private Something something;
public Something Something
{
    get
    {
        return something ?? (something = new Something());
    }
}
于 2013-04-22T08:55:23.110 回答
2

我不一定反对操作员,但是,这种变量重用对我来说并不是“正确的方式”。应该是明显的 NULL 指针的错误最终会填充意外的数据并以某种意外的方式工作,等等......

于 2009-03-17T20:03:34.470 回答
2

我实际上是为 PHP7 实现的。它现在处于 RFC 提案阶段。 https://github.com/php/php-src/pull/1795

实际上这是一个关于 PHP7 中空合并运算符的问题。检查这个:

$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? ‘value’;
I want to check if some var is null and if the same var is null set the same var to ‘value’.

因此,我在等号运算符之后重复相同的变量,这感觉不对。

所以我觉得我们需要另一个像“??=”这样的运算符,类似于+=;

$this->request->data['comments']['user_id'] ??= 'value'。因此,如果 var 为 null,则将其设置为“value”,否则保持不变。

在那个拉取请求中,我试图实现这一点。

$ sapi/cli/php -r '$num = null;$num ??= 5; echo $num;'
5
于 2016-03-09T00:35:31.373 回答
1

我会说??操作员,更确切地说,上述模式并不常见,因此新的操作员太过分了。

于 2009-03-17T20:01:17.813 回答
1

??类似于以下方式使用三元运算符的简写:

(myObject != null) ? myObject : somethingElse;

而不是算术运算的简写,我认为??=运算不适合。它是一个条件运算符。

于 2009-03-17T20:10:08.760 回答
-1

老实说,我首先对 =++ 运算符感到厌烦,它的用法相当普遍和普遍。从清晰的角度来看,您需要输入的额外几个字符可能不值得更改语言以添加 ??=。如果这是投票,我会投票反对更改语言(好问题,坏主意。:-)

我还没有尝试过,但是您可以将 ??= 映射到 Visual Studio 中刚刚为您重写的宏吗?

于 2009-03-17T19:59:59.627 回答