C# 快捷方式&;=表现得像&;不是,&;
我使用的是C#6.0 VS2015;上面的代码触发空异常C# 快捷方式&;=表现得像&;不是,&;,c#,C#,我使用的是C#6.0 VS2015;上面的代码触发空异常 &=运算符的行为类似于&运算符。我希望它的行为类似于&&,如果值已经为假,则跳过对右侧的求值(请参阅文章中“短路”行为的解释) 这种行为是故意的还是一个bug?请查看文档: x&=y 相当于x=x&y (…)运算符对整数操作数和布尔操作数执行位逻辑“与”运算 我想你是想避免空检查 下面的代码不会引发异常,因为您声明结果变量为假;在这种情况下,语言优化将使表达式短路,并且不会计算第二部分: public static void Main()
&=
运算符的行为类似于&
运算符。我希望它的行为类似于&&
,如果值已经为假,则跳过对右侧的求值(请参阅文章中“短路”行为的解释)
这种行为是故意的还是一个bug?请查看文档:
x&=y
相当于x=x&y
(…)运算符对整数操作数和布尔操作数执行位逻辑“与”运算
我想你是想避免空检查
下面的代码不会引发异常,因为您声明结果
变量为假
;在这种情况下,语言优化将使表达式短路,并且不会计算第二部分:
public static void Main()
{
var result = false;
Xpto xpto = null;
result &= xpto.Some;
}
public class Xpto
{
public bool Some { get; set; }
}
如果你是一个在线人士,你可以通过写下以下内容来让事情变得更加一致:
result = result && xpto.Some;
或者,用简单的C#:
有人想把它翻译成英语吗?
和
对整型执行按位的和
运算,对布尔型执行逻辑的和
运算。@Eser看起来够英语的了。。。如果需要翻译-“为什么&
to的行为不像&
那样,而是像文档/C#规范中所述的&
那样?”。如果&
的行为类似于&
,这是否令人惊讶?注意:无论对每个发布的代码使用&=
或&
,都会发生Null ref异常,因为xpto
为Null。@Rahul,运行时优化将启动并跳过第二个术语的计算,因为和操作中带有false
参数的任何内容都将导致false
result@AlexeiLevenkov我对原来的问题做了一个激进的修改,所以如果我错了,请回复。我也知道按位和短路之间的区别,我假设OP试图使用短路形式,但他选择了错误的运算符。我编辑这个答案是为了反映你的想法concern@RubensFarias公平编辑。我已经回复了您的问题中的更改-检查它(即使编辑很难证明是一个好问题)短路不是一个“运行时优化”-术语表明短路是一个编译器可以做的事情,而另一个编译器不会。它是实现简洁性和原子性的语言保证,正如&
保证始终计算两个操作数一样。不幸的是,&=
存在,但不存在&=
。
result = result && (xpto == null ? true : xpto.Some);
if (xpto != null)
result = result && xpto.Some;