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

本文关键字:接口 什么 区别 对象 IsAssignableFrom AS 检查 IS 类型 | 更新日期: 2023-09-27 17:51:09

我对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;
    }
}

The Goal:判断对象o是否实现了给定的接口定义IExampleInterface

问题:

  • 哪个实现是最佳实践?
  • 不考虑第一个问题,从技术上讲,哪一个是最正确的?
  • 操作人员的具体差异是什么?MSDNAA并没有真正详细说明它们。
  • 哪个呼叫耗时最长/最短?

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

"Is"操作符允许您检查特定实例是否具有特定类型或继承该类型,而IsAssignableFrom允许您检查一个类型是否可转换为另一个类型。

如果你必须计算某个对象是否属于特定类型那么你可以使用is:

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

但是如果你只有这样的类型:

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

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

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

第二种方法是当您需要发现对象是否是接口的实现时,在将该对象强制转换为接口后也使用该对象。如果您计划在null检查之后丢弃强制转换的结果,那么从一开始就没有必要执行强制转换。

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

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

操作符is :

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

操作符as :

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

操作符isAssignableFrom :

  • 检查对象是否可以被强制转换为其他类型。
  • 应该在运行时对象类型未知时使用。
  1. var impInterface = obj is ISampleInterface;
  2. 你说的"技术上"是什么意思?它们都有用。如果您只想知道它是否实现了接口,那么这就是is的用途。如果你想要一个新的变量作为接口,那么使用as
  3. is确定对象是否从类型派生并返回布尔值。as尝试将对象强制转换为类型,并返回强制转换为该类型的新变量,否则返回null。(但你从你的问题中知道这一点)。
  4. as可能需要更长的时间,即使cast有效。

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

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

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

你应该做

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

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