【问题标题】:C# 'is' operator ClarificationC# 'is' 运算符说明
【发布时间】:2011-06-06 22:51:54
【问题描述】:

is 运算符是否指示对象是否是某个类的实例,或者是否可以转换为到该类? p>

假设我有一个名为commandDbCommand,它实际上已被初始化为SqlCommandcommand is OracleCommand 的结果是什么?

SqlCommandOracleCommand 都继承自 DbCommand

【问题讨论】:

  • 结果会不会是假的,因为 DbCommand 和 SqlCommand 都不是 OracleCommand 的实例?
  • is 指示对象是该类型的实例还是派生自该类型。 msdn.microsoft.com/en-us/library/scekt9xw(v=VS.100).aspx
  • @they:这两个定义不一样吗?
  • 这是您在编写问题时可以测试的内容之一。 :P
  • @theycallmorty:它们有何不同? objClass 的一个实例当且仅当它可以转换为 Class,对吧?除非我错过了什么……

标签: c#


【解决方案1】:

它检查对象是否是该类型的成员,或者是从基类型或接口继承或实现的类型。在某种程度上,它确实会检查对象是否可以转换为所述类型。

command is OracleCommand 返回 false,因为它是 SqlCommand,而不是 OracleCommand。但是,command is SqlCommandcommand is DbCommand 都将返回 true,因为它是这两种类型的成员,因此可以分别向下转换或向上转换。

如果您具有三个继承级别,例如BaseClassSubClassSubSubClass,初始化为 new SubClass() 的对象仅对 is BaseClassis SubClass 返回 true。虽然SubSubClass 派生自这两者,但对象本身并不是它的实例,因此is SubSubClass 返回 false。

【讨论】:

    【解决方案2】:

    如果提供的表达式不为空,is 表达式的计算结果为 true,并且提供的对象可以转换为提供的类型,而不会引发异常。

    Source

    【讨论】:

      【解决方案3】:

      来自MSDN

      如果 [...] 表达式 可以转换为类型,则 is 表达式的计算结果为 true

      【讨论】:

        【解决方案4】:

        http://msdn.microsoft.com/en-us/library/scekt9xw%28v=vs.80%29.aspx

        如果提供的表达式不为空,则 is 表达式的计算结果为 true,并且提供的对象可以强制转换为提供的类型而不会引发异常。

        【讨论】:

          【解决方案5】:

          is 指示对象是否可以转换为类或接口。

          如果你有一个基类和一个子类,那么:

          var obj = new SubClass();
          

          obj is SubClass 返回真;

          obj is BaseClass 也返回 true;

          【讨论】:

          • 如果要与实际类型进行比较,请使用command.GetType().Equals(typeof(SqlCommand))
          • 如果不相关的类型使用显式转换运算符在它们之间进行转换呢?
          【解决方案6】:

          if(something is X) 检查 something 的基础类型是否为 X。这与检查一个类型是否支持转换为 X 有很大不同,因为许多类型可以支持转换为 X 而不是 X 类型。 p>

          相反,as 运算符尝试转换为特定类型,如果源类型不在目标类型的继承链中,则分配 null

          【讨论】:

            猜你喜欢
            • 2012-09-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-04
            • 2018-03-25
            • 2017-08-28
            • 2021-08-23
            相关资源
            最近更新 更多