C# 4.0 使用三元运算符的缺点
我的源代码中有以下声明C# 4.0 使用三元运算符的缺点,c#-4.0,C# 4.0,我的源代码中有以下声明 int tableField1; int tableField2; int propertyField1; int propertyField2; if (tableField1 != null) { propertyField1 = tableField1; } if (tableField2 != null) { propertyField2 = tableField1; } // the above pattern is repeated for 1
int tableField1;
int tableField2;
int propertyField1;
int propertyField2;
if (tableField1 != null)
{
propertyField1 = tableField1;
}
if (tableField2 != null)
{
propertyField2 = tableField1;
}
// the above pattern is repeated for 10 tablefields ie tableField3, tableField4... tableField10
我使用三元运算符简化了上述状态,如下所示
propertyField1 = tableField1 != null ? tableField1 : propertyField1;
propertyField2 = tableField2 != null ? tableField2 : propertyField2;
以下是我的问题:
1) 三元运算符的使用效率比if语句低
2) 使用三元运算符有哪些缺点(如果有)。为什么不使用空合并运算符
propertyField1 = tableField1 ?? propertyField1;
诚然,将原始值赋回同一个变量看起来有点奇怪。有可能它的效率会比if
语句稍微低一点,因为在理论上,您正在读取值并再次赋值。。。但如果JIT忽略了这一点,我也不会感到惊讶。无论如何,这绝对是在微观优化的层面上
有些人认为条件运算符对可读性是有害的。我一般认为这样简单的语句是好的,尽管它有点模糊了“只有当我们有了一个新的值时才改变它”的含义。
据我所知,三元语句大多只是句法糖,尽管编译器可以为此进行优化
在这种情况下,我相信它可能会更有效,尽管我猜编译器会优化它,使其与if语句大致相同 缺点?嗯,在某些情况下可能更难阅读。这取决于你在追求什么。1)不,编译器将(应该)以与显式if
语句完全相同的方式处理三元运算符,因此效率没有差别
2) 唯一的缺点是它会使代码更难阅读。另一方面,它更简洁。出于可读性原因,通常避免使用三元语句,非常简单的情况除外。这可能算是一个非常简单的案例
我声称这个答案比Jon Skeet的答案更不懂语言:)我不同意你对第1点的评估。当
tableField1
为空时,if语句版本仅对propertyField1
赋值。否则,该值将无法更改。从逻辑上讲,条件运算符版本将始终分配给属性字段1
,可能是在读取同一字段之后。想象一下,另一个线程正在处理这些值-它可以在读取之后但在赋值之前为propertyField1
分配一个新值。这样写的东西就可能丢失。对于if
版本,这是不可能的。这很公平。尽管如此,作业还是很便宜的,所以除非这是一个紧密的循环,否则不会有太大的区别。我还假设了一个单线程系统。我并不认为我的答案比你的更正确:)谢谢你,乔恩。我不知道空合并。