在某些情况下,语法糖会以令人不快的方式相互作用。
一些具体的例子:
第一个是 c#(或 java)特定的,自动装箱和锁/同步结构
private int i;
private object o = new object();
private void SomethingNeedingLocking(bool b)
{
object lk = b ? i : o;
lock (lk) { /* do something */ }
}
在这个例子中,可以使用任何对象作为同步点的有用的锁结构与自动装箱相结合,会导致一个可能的错误。每次都会对 i 的新盒装实例进行锁定。有争议的是,锁定结构过于有用,并且锁定的其他一些特定结构会更好,但肯定组合仍然存在缺陷。
多变量声明和指针:
long* first, second;
一个经典的错误(虽然很容易发现)。多个变量的糖不适合指针声明。
一些构造不需要糖的其他方面来引起问题,一个经典的例子是 ++ 运算符。它巧妙地让你避免写作
i = i + 1;
一种广泛使用的构造(并且它本身具有错误范围,因为如果您希望更改使用 i,则必须记住更新这两个变量)。然而,由于这很容易嵌入到其他表达式中,前缀和后缀的问题出现了。当在 for 循环中使用时,这无关紧要,评估发生在任何其他评估之外,但在其他地方使用它可能会造成混淆(因为您可能嵌入了计算的一个非常重要的方面(无论是当前还是下一个value 应该被使用) 变成一个非常小且容易遗漏的形式。
以上所有情况(编译器确实应该为您发现的锁/盒子除外)都是使用可能很好的情况,或者有经验的程序员可能会认为“这对我来说非常清楚”,但肯定存在混淆的范围对于新手程序员或转向不同语法的程序员。