シンタックス シュガーは、場合によっては不快な方法で相互作用する可能性があります。
いくつかの具体的な例:
1 つ目は、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 ループ内で使用する場合、これは問題ではありません。評価は他の評価の外側で行われますが、他の場所で使用すると、混乱の原因になる可能性があります (計算の非常に重要な側面を埋め込む可能性があるため (現在または次のいずれか)値を使用する必要があります) を非常に小さく、見逃されやすい形式にします。
上記のすべて (コンパイラーが実際に見つけなければならないロック/ボックスを除く) は、使用方法が問題ないか、経験豊富なプログラマーが「それは私には完全に明らかだ」と考えるかもしれませんが、混乱の余地が確かに存在する場合です。初心者のプログラマーや、別の構文に移行する人向けです。