IS vs. AS vs. IsAssignableFrom - 检查对象类型和接口时有什么区别?

IS vs. AS vs. IsAssignableFrom - What are the differences when checking for objectTypes and Interfaces?

我是 C# 的新手,我想知道你是否可以帮助我。

场景:

public bool ObjectImplementsSpecificInterface (object obj)
{
    // 1.
    if (obj is IExampleInterface) 
    {
        return true;
    }

    // 2.
    var tmp = obj as IExampleInterface;
    if (tmp != null) 
    {
        return true;
    }

    // 3.
    if (typeof(IExampleInterface).IsAssignableFrom (obj.GetType ())) 
    {
        return true;
    }
}

目标:确定对象 o 是否实现了给定的接口定义IExampleInterface

题目:

  1. var impInterface = obj 是 ISampleInterface;
  2. "technically" 是什么意思?他们都工作。如果你想让 ois 知道它是否实现了接口,那就是 is 的目的。如果你想要一个被转换为接口的新变量,那么使用 as.
  3. is 确定对象是否派生自类型并且 return 是否为布尔值。 as 尝试将对象转换为类型,return 将新变量转换为类型,如果不能则为 null。 (但你从你的问题中知道这一点)。
  4. as 可能需要更长的时间,即使转换有效。

"Is" 运算符允许您检查特定实例是否属于特定类型或继承此类型 wheras IsAssignableFrom 允许您检查一个类型是否可转换为另一个类型。

因此,如果您遇到必须评估某个对象是否属于特定类型的情况,那么您可以使用:

Random r = new Random();
if (r is Random)
{
    reutrn true;
}

但是如果你只有这样的输入方法:

public bool CheckIfTypeIsRandom(Type typeKnownAtRuntime)
{
     if (typeof(Random).IsAssignableFrom(typeKnownAtRuntime) 
     {
         return true;
     }
     return false;
}

那么你必须使用 IsAssignableFrom。

这三种方式都将提供相同的结果,并且花费的时间大致相同,但只有第一种是专门针对您的情况设计的。

当你从一个对象开始时,你只需要知道它的 class 是否实现了给定的接口,第一种方法(即 is 运算符)是最合适的.

第二种方法适用于需要查明对象是否是接口的实现的情况,也在将对象转换为接口后使用该对象。如果您打算在 null 检查后丢弃转换结果,那么首先执行转换就没有意义了。

当你有一个 System.Type 对象而不是对象本身时,第三种方法主要用于反射。

1) 如果你只想检查一个对象是否属于某个类型或实现了一个接口,请使用is.

2) 如果你想检查类型或接口并对对象做一些事情,使用as。所以代替:

if (obj is A) {
    A casted = (A) obj;
    casted.MethodOfA ();
}

你应该做

A casted = obj as A
if (casted != null) {
    casted.MethodOfA ();
}

3) 仅当 1) 不可用时才使用此方法,例如您将类型作为 Type 类型的对象,而不是 T.

从以下帖子中收集到的信息和可能正确的答案如下:

运算符is:

  • 应该用于确定对象是实现接口还是特定类型,所以这就是我的问题的答案:哪个是最佳实践?

运算符as:

  • 应该比 is 花费的时间更长。
  • 通常用于将对象存储到代表正确类型的 var 中。
  • 用于进一步处理对象。调用函数或检查接口类型。

运算符isAssignableFrom:

  • 检查对象是否可以转换为另一种类型。
  • 如果对象的类型在运行时未知,则应使用。