实例的优先级的原因/是

2022-09-02 11:43:49

在 C#/Java 中,运算符的优先级分别会导致一些丑陋的必要括号。例如,你必须写.of,而不是写。isinstanceofif (!bar instanceof Foo)if (!(bar instanceof Foo))

那么,为什么语言团队决定运算符优先级高于 is/instanceof 呢?诚然,在C#中,您可以覆盖这在某些情况下会导致不同的结果,但这些情况似乎非常罕见(并且在任何情况下都是不直观的),而检查某些东西是否不是某种东西的类型或子类型的情况更有可能。!operator!


答案 1

在 Java 中,是关系运算符之一,并且具有与其他运算符相同的优先级:instanceof

RelationalExpression:
    ShiftExpression
    RelationalExpression < ShiftExpression
    RelationalExpression > ShiftExpression
    RelationalExpression <= ShiftExpression
    RelationalExpression >= ShiftExpression
    RelationalExpression instanceof ReferenceType

从这个角度来看,这两条线应该遵循相同的结构是有道理的:

if (!(a instanceof b))
if (!(a < b))

答案 2

阴谋论:

C# 设计人员不希望您使用运算符。使用此运算符通常是一种糟糕的OOP设计的味道。如果你发现自己经常使用它,这可能意味着你的类层次结构是错误的,你需要更多地依赖虚拟方法和模式。Java设计师走得更远:他们命名了运算符,让你每次使用它时都感到畏缩。instanceof

实际上,这并非不可能。在许多情况下,语言和库设计人员使某些功能不方便使用。一些例子:.NET中的字符编码(你应该总是使用Unicode),在Pascal中(你应该避免它)等。有时它是由糟糕的设计引起的(如.NET中的WPF),但有时它是故意的。goto


推荐