空合并赋值运算符?

时间:2009-03-17 19:54:28

标签: c# operators language-features null-coalescing-operator

如果C#允许使用?? =运算符,那将是非常好的。我发现自己经常写下以下内容:

something = something ?? new Something();

我宁愿这样写:

something ??= new Something();

思考?新的语言扩展总是存在争议。

7 个答案:

答案 0 :(得分:15)

像Ruby这样的其他编程语言经常使用它:

something ||= Something.new

答案 1 :(得分:6)

如果'something'是属性访问器的私有字段,则可以执行以下操作....如果发现该字段为空,则执行赋值。

private Something something;
public Something Something
{
    get
    {
        return something ?? (something = new Something());
    }
}

答案 2 :(得分:2)

我并不一定反对运营商,但是,那种变量重用对我来说并不像是“正确的方式”。应该是明显的错误指针的错误最终填充了意外的数据,并以某种意想不到的方式工作,等等....

答案 3 :(得分: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

答案 4 :(得分:1)

我会说??运算符以及更有针对性的上述模式并不常见,因此新运算符过度。

答案 5 :(得分:1)

由于??是使用三元运算符的简写,其方式类似于:

(myObject != null) ? myObject : somethingElse;

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

答案 6 :(得分:-1)

我老实说,首先是对= ++运算符进行了撕裂,而且它的使用相当普遍且常见。从清晰的角度来看,你需要输入的额外几个字符可能不值得更改语言来添加?? =。如果这是投票,我会投票反对语言的改变(好问题,坏主意。: - )

我没有试过这个,但是你可以将??映射到Visual Studio中的一个宏,它只为你做了重写吗?