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"操作符允许您检查特定实例是否具有特定类型或继承该类型,而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
:
- 检查对象是否可以被强制转换为其他类型。
- 应该在运行时对象类型未知时使用。
- var impInterface = obj is ISampleInterface;
- 你说的"技术上"是什么意思?它们都有用。如果您只想知道它是否实现了接口,那么这就是
is
的用途。如果你想要一个新的变量作为接口,那么使用as
。 -
is
确定对象是否从类型派生并返回布尔值。as
尝试将对象强制转换为类型,并返回强制转换为该类型的新变量,否则返回null。(但你从你的问题中知道这一点)。 -
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 ();
}
Type
的对象而不是T
。