Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IS vs.AS vs.IsAssignableFrom-检查对象类型和接口时有什么区别?_C#_Performance_Object_Interface_Operators - Fatal编程技术网

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

C# IS vs.AS vs.IsAssignableFrom-检查对象类型和接口时有什么区别?,c#,performance,object,interface,operators,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) {

我对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并没有真正详细地介绍它们
  • 哪个通话时间最长/最短
  • var impInterface=obj为ISampleInterface
  • 你说的“技术上”是什么意思?他们都工作。如果您只想让ois知道它是否实现了接口,那就是
    的作用。如果您想要一个新变量作为接口转换,则使用
    作为
  • is
    确定对象是否派生自类型并返回布尔值
    as
    尝试将对象强制转换为类型,并将新变量强制转换为类型,如果不能,则返回null。(但你从你的问题中知道这一点)
  • as
    可能需要更长的时间,即使演员阵容有效 “Is”运算符允许您检查特定实例是否属于特定类型或继承此类型,而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。

    所有三种方法都将提供相同的结果,所需时间大致相同,但只有第一种方法是专门针对您的情况设计的

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

    第二种方法适用于需要确定对象是否是接口的实现,并在将该对象强制转换到接口后使用该对象的情况。如果您计划在
    null
    检查后丢弃强制转换的结果,那么首先执行强制转换是没有意义的

    第三种方法主要用于反射,当您有
    系统时。键入
    对象而不是对象本身。

    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
    • 通常用于将对象存储到表示正确类型的
      var
    • 用于进一步处理对象。调用函数或检查接口的类型
    操作员
    可从中指定:

    • 检查对象是否可以强制转换为其他类型
    • 如果在运行时对象的类型未知,则应使用

    使用
    构造(变量1)或
    作为
    (变量2),当您需要进一步的值时。我无法想象这以前没有在这里讨论过。我也这么认为,但我只能找到关于特定运算符的答案,而不能相互比较。如果你找到一个可以回答我问题的帖子,请随意链接它!:)4:
    typeof(IExampleInterface)。IsInstanceOfType(obj)
    。在调用
    obj.GetType()
    之前,您应该检查
    obj
    是否为null。以下是上述评论的参考:我正要发布相同的评论。从技术上讲,这是最尖锐的观点。所以,当我看c#如何工作的时候,基本上哪一个操作系统才是正确的选择。我对“c-Sharp-ish”是什么意思也摸不着头脑。显然他们都是C。哪一个是“要走的路”取决于您尝试执行的操作,确定变量是否引用从某个指定类型派生的对象,或者将其强制转换为该类型。第三种方法主要用于反射,当你有一个System.Type对象而不是对象本身时。即使对于泛型,它也有一些用途……哎呀,我的错。不,反射在其中不起作用。