【问题标题】:"Is" c# operator just like instanceof in java?“是” c# 运算符就像 java 中的 instanceof 一样吗?
【发布时间】:2012-07-03 08:41:12
【问题描述】:

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

提前考虑。

【问题讨论】:

  • 是的,是一样的。它使用起来很安全,有时也很合适。
  • 有时是必要的。只要确保你没有过度使用它。
  • 您的问题可能与stackoverflow.com/questions/282459/…重复
  • 不完全一样,我知道它或多或少是等价的,但我想知道在 C# 中使用它是否更常见(容忍?)

标签: c#


【解决方案1】:

这是“安全的”。至少使用此检查更安全,而不是仅强制转换并假定类型!您可能更喜欢使用as 运算符,如果合适,它会强制转换为所需的类型,否则返回 null。请记住检查是否为空。

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

【讨论】:

  • 是的,所以它或多或少与 instanceof 相同。 “你的模型不太对劲”,但有时是不可避免的。谢谢
  • 我已经和人们讨论过 instanceof/is 以及为什么你永远不应该使用它。有趣的是,我在 Java 社区中发现了更多的反感。我的观点是:instanceof/is 在检查接口时,比如 IComparable,在大多数情况下都很好,甚至在泛型/框架代码中也是必要的。例如,这比过度使用泛型要好。在大多数情况下,您不应该依赖具体的实现,所以我会猜测使用 instanceof/is 来检查类的代码。
  • 另一方面,C# 使用 is 和 as 来进行模式匹配,这是最近才引入的。所以至少微软认为它本身的设计还不错。
【解决方案2】:
if (obj is FooObject)
{
    ((FooObject)obj).Foo();
}

等价于

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

【讨论】:

    猜你喜欢
    • 2012-07-29
    • 2011-04-26
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    相关资源
    最近更新 更多