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 );