IS vs. AS与IsAssignableFrom - 检查objectTypes和Interfaces有什么区别?

时间:2015-05-29 12:06:13

标签: c# performance object interface 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;
    }
}

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

问题:

  • 哪种实施是最佳做法?
  • 无视第一个问题,哪个技术上最正确?
  • 运营商的具体差异是什么? MSDNAA并没有真正详细说明。
  • 哪个通话时间最长/最短?

5 个答案:

答案 0 :(得分:4)

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

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

第二种方法适用于需要查明对象是否是接口实现的情况,在将其转换为接口后也使用该对象。如果你计划在null之后扔掉演员的结果 - 检查它,那么首先进行演员表是没有意义的。

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

答案 1 :(得分:2)

"是"运算符允许您检查特定实例是否具有特定类型或继承此类型,IsAssignableFrom允许您检查Type是否可转换为其他类型。

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

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。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

以下帖子收集到的信息和可靠的答案如下:

运营商is

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

运营商as

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

运营商isAssignableFrom

  • 检查物体是否可以铸造成另一种类型。
  • 如果在运行时期间对象的类型未知,则应该使用。