Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';我不知道吗?_C#_Language Features - Fatal编程技术网

C# 为什么可以';我不知道吗?

C# 为什么可以';我不知道吗?,c#,language-features,C#,Language Features,我经常发现自己在做: foo = foo ?? x; 为什么我不能: foo ??= x; 编辑:我知道这不是语言的一部分。。。我的问题是“为什么不”?我发现重复“foo”的必要性是令人不愉快的,并且可能容易出错。它看起来就像: foo = foo + x; 因为C#中没有这样的???=运算符 虽然+=看起来像是用不同语法表示的两个运算符,但它只是一个运算符。没有运算符执行此操作。然而,对于该语言的未来版本来说,这是一个有趣的建议。我怀疑到目前为止还没有包括它,因为聚合操作符的主要用例是可

我经常发现自己在做:

foo = foo ?? x;
为什么我不能:

foo ??= x;
编辑:我知道这不是语言的一部分。。。我的问题是“为什么不”?我发现重复“foo”的必要性是令人不愉快的,并且可能容易出错。它看起来就像:

foo = foo + x;

因为C#中没有这样的???=运算符


虽然+=看起来像是用不同语法表示的两个运算符,但它只是一个运算符。

没有运算符执行此操作。然而,对于该语言的未来版本来说,这是一个有趣的建议。我怀疑到目前为止还没有包括它,因为聚合操作符的主要用例是可为null的类型,并获取如下所示的值:

int? testValue;

return testValue ?? 0;

而不是像您的示例那样在赋值操作中。另外,尽管
+=
保证在所有情况下修改foo的值,但
+=0
??=
不会

foo = foo ?? x 
真的只是

foo = foo != null ? foo : x

在这一点上,与+=的类比开始瓦解。

没有理由不存在这样一个操作符,但我怀疑语言增加的复杂性,虽然微不足道,但超过了好处(我认为“非常微不足道”)


基本上,任何对语言的补充都有很高的要求。你说你经常使用这个-多久一次,真的?虽然我认为代码>?/代码> HANY,但我不能说我经常使用它。

主要是因为+=,-=等被添加到后面的思想中,以保持与C&C++的兼容性。不是C或C++的一部分,不需要添加额外的操作符。 <>(*)注意,在C++中,当定义类的运算符时,通常定义运算符+=(),然后基于它实现操作符+()。(这通常是最有效的方法)。


但是,在C#中,实现运算符+,编译器会根据oper+自动添加运算符+=。这就是为什么我说+=运算符是事后加上去的。

这种语句风格感觉像是来自属性获取者的延迟加载。在这种情况下,我会选择这种语法

private Foo myFoo;
public Foo MyFoo
{
    get
    {
        return myFoo ?? (myFoo = new Foo());
    }
}

我看不出你为什么会使用??运算符自分配变量

也许您正在根据某个数据库值设置
foo
,该值恰好为
NULL
,因此使用??该赋值期间的运算符(这样就不需要???=):

与之相反:

foo = (int?)rows["possiblyNullCount"];
foo = foo ?? 0;

虽然不完全是你想要的(不是??=)。。。您也许可以利用扩展方法

static void Main(string[] args)
{
    object foo = null;
    object x = "something";
    Console.WriteLine(foo.NullToValue(x));
}

public static class ObjectExtensions
{
    public static object NullToValue(this object obj, object value)
    {
        return obj != null ? obj : value;
    }
}
我还没有花大量的时间去思考这可能不起作用的方法,但在我的示例应用程序中它似乎通过了嗅觉测试…

不是一个“运算符”,因为它对操作数的值进行“运算”。您应该将其视为一种语言结构

假设你有:

node = node.next;
那么,您是否希望能够执行以下操作

node .= next;
我认为
?=
不存在的原因与
=
不存在的原因相同

此外,像
+=
*=
等一元运算符在程序集级别上有直接对应项。伪汇编:

add reg0, 1
mul reg1, 5
这些操作符的存在是很自然的。

一般来说,C语言设计团队对于添加新语法持保守态度。他们说,语言增加的价值必须与语言复杂性增加的成本进行权衡

Peter Hallam曾担任过一段时间的C#编译器开发负责人,同时也是C#语言设计团队的成员。他描述了他衡量一个新特性的方法,称为尺度,尽管他更关注交互式GUI特性而不是语言特性

本文特别与
??=
的问题相关:

通常正确的设计决策是 不会改变任何事情。这可能是 我学到的最重要的一课 从看安德斯在C# 语言设计会议。经常是 这门语言的范围是用英语提出的 可能是真的 可以取得的收益。我们可以 防止用户使用公共编码 错误,或者我们可以改进 某种语言的可使用性 问题域。然后想了想 真的很难,通过所有的 解决这一问题的各种选择 答案是做。。。。没有什么!即使 虽然这个问题是有效的,而且 看起来我们应该可以添加 改善情况的东西,, 经过仔细思考,没有任何问题 解决问题的方法是什么 成本不会超过解决方案的收益。 许多最重要的 有价值的决定我见过安德斯 做出不添加的决定 语言的复杂性,除非 附加值证明了复杂性的合理性。 在边缘案件中,他是最重要的 总是选择不加任何东西 边缘事物边缘的事物

参考资料:

在讨论将
??=
+=
进行类比是否有意义时,每个人都缺少一个更简单的答案

问题:为什么你不能做
foo???=x在C#中

回答:因为,如果他们添加了该功能,最有可能的情况是:

。。。想想所有的时间和努力 需要如何设计功能 应该行,把所有的边界都钉上 条件,然后对其进行编码 向上,为它编写自动化测试。。。写下 文档和帮助文本,以及 继续维护代码、测试、, 以及该功能的 预期寿命(在本报告中 这种情况可能永远不会发生)。都可以 这些资源已用于 会有更大影响的东西 对客户群的总体利益? (答案总是 “是的”-每个人和她的嫂子 能找到完成句子的方法, “我不敢相信他们浪费了所有的时间
add reg0, 1
mul reg1, 5
foo ?? foo = x;
return foo ?? foo = x;
DoStuff( foo ?? foo = x );