Voo*_*Voo 19 c# java language-theory
在C#/ Java中,运算符优先级is分别instanceof导致一些丑陋的必要括号.例如,而不是写作if (!bar instanceof Foo)你必须写if (!(bar instanceof Foo)).
那么为什么语言团队认为!运营商优先级高于/ instanceof?不可否认,在C#中你可以覆盖operator!哪些会在某些情况下导致不同的结果,但这些情况似乎非常罕见(并且在任何情况下都不直观),而检查某些东西不是某种类型或子类型的情况很多更倾向于.
ass*_*ias 16
在Java中,instanceof是关系运算符之一,并且具有与其他运算符相同的优先级:
RelationalExpression:
ShiftExpression
RelationalExpression < ShiftExpression
RelationalExpression > ShiftExpression
RelationalExpression <= ShiftExpression
RelationalExpression >= ShiftExpression
RelationalExpression instanceof ReferenceType
Run Code Online (Sandbox Code Playgroud)
从这个角度来看,这两行应遵循相同的结构是有道理的:
if (!(a instanceof b))
if (!(a < b))
Run Code Online (Sandbox Code Playgroud)
Ath*_*ari 11
阴谋论:
C#设计师不希望您使用is运算符.使用此运算符通常是糟糕的OOP设计的气味.如果您经常使用它,可能意味着您的类层次结构错误,您需要更多地依赖虚拟方法和模式.Java设计人员走得更远:他们将操作员命名为instanceof每次使用时都会让你感到畏缩.
实际上这不太可能.在很多情况下,语言和图书馆设计师会使某些功能使用起来不方便.一些例子:.NET中的字符编码(你应该总是使用Unicode),goto在Pascal中(你应该避免使用它)等.有时它是由糟糕的设计(如.NET中的WPF)引起的,但有时它是有意的.
ILM*_*tan 10
以下是我对此事的看法,没有权威来源.
instanceof是一个非常大的运营商.大多数操作符最多是两个字符.另外,instanceof它和变量之间必须有空格.由于这两个独特的东西,当你看像一个表达式!bar instanceof Foo时,instanceof似乎自然地分开!bar和Foo,很多人会觉得奇怪,如果!bar不是一个子表达式.
类似的思路也可以应用于is其他参数,只需遵循Java已经做过的事情.