&引用;是";c#运算符与java中的instanceof一样?

&引用;是";c#运算符与java中的instanceof一样?,c#,C#,我刚刚发现了这个操作员,我想知道使用它是否安全。 我的意思是,在java中,我们的老师总是告诉我们要避免instanceof(),因为它破坏了多态性,并且经常显示出糟糕的编码 提前完成。这是“安全的”。至少使用此检查比强制转换和假定类型更安全!您可能更喜欢使用运算符,如果合适,它将强制转换为所需的类型,否则返回null。请记住检查空值 但通常,显式类型检查表示您的模型不太正确。有时这是不可避免的,但如果你经常这样做,我会退后一步,重新考虑你的模型 if (obj is FooObject) {

我刚刚发现了这个操作员,我想知道使用它是否安全。 我的意思是,在java中,我们的老师总是告诉我们要避免instanceof(),因为它破坏了多态性,并且经常显示出糟糕的编码


提前完成。这是“安全的”。至少使用此检查比强制转换和假定类型更安全!您可能更喜欢使用运算符,如果合适,它将强制转换为所需的类型,否则返回null。请记住检查空值

但通常,显式类型检查表示您的模型不太正确。有时这是不可避免的,但如果你经常这样做,我会退后一步,重新考虑你的模型

if (obj is FooObject)
{
    ((FooObject)obj).Foo();
}
相当于

if (obj instanceof FooObject) {
    ((FooObject)obj).foo();
} 

是的,是一样的。它使用起来很安全,有时是合适的,有时是必要的。只是要确保你没有过度使用它。你的问题可能是不完全相同的事情的重复,我知道它或多或少是一个等价物,但我想知道在C#p中使用它是否更常见(可以容忍?),所以它或多或少与instanceof相同。“你的模型不太合适”,但有时不可避免。谢谢我已经和人们讨论过instanceof/is,以及为什么永远不要使用它。有趣的是,我在Java社区中发现了更多的厌恶。我的观点是:instanceof/is在检查接口时,如IComparable,在大多数情况下是可以的,在泛型/框架代码中甚至是必要的。例如,这比过度使用泛型要好。但是,在大多数情况下,您不应该依赖具体的实现,因此我猜测使用instanceof/is检查类的代码。另一方面,C#使用is和as进行模式匹配,这是最近才引入的。所以至少微软认为它的设计本身还不错。