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

5 c# performance interface object operators

我对 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

问题:

  • 哪种实现是最佳实践?
  • 抛开第一个问题,哪一个在技术上最正确?
  • 运营商的具体区别是什么?MSDNAA 并没有真正详细介绍它们。
  • 哪个通话时间最长/最短?

Prz*_*ski 6

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

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

Random r = new Random();
if (r is Random)
{
    reutrn true;
}
Run Code Online (Sandbox Code Playgroud)

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

public bool CheckIfTypeIsRandom(Type typeKnownAtRuntime)
{
     if (typeof(Random).IsAssignableFrom(typeKnownAtRuntime) 
     {
         return true;
     }
     return false;
}
Run Code Online (Sandbox Code Playgroud)

那么你必须使用IsAssignableFrom。


das*_*ght 5

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

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

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

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


Cha*_*ana 1

  1. var impInterface = obj 是 ISampleInterface;
  2. 你所说的“技术上”是什么意思?他们都工作。如果您只想知道它是否实现了该接口,那么这就是目的is。如果您想要一个被强制转换为接口的新变量,请使用as。
  3. is确定对象是否派生自类型并返回布尔值。 as尝试将对象强制转换为该类型,并返回强制转换为该类型的新变量,如果不能,则返回 null。(但你从你的问题中知道这一点)。
  4. as即使演员阵容有效,也可能需要更长的时间。