IS vs. AS vs. IsAssignableFrom - 检查对象类型和接口时有什么区别?
IS vs. AS vs. IsAssignableFrom - What are the differences when checking for objectTypes and Interfaces?
我是 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;
}
}
目标:确定对象 o 是否实现了给定的接口定义IExampleInterface
。
题目:
- 哪种实施是最佳做法?
- 先不管第一个问题,哪一个在技术上是最正确的?
- 运算符的具体区别是什么? MSDNAA 并没有真正详细地介绍它们。
- 哪个通话时间最长/最短?
- var impInterface = obj 是 ISampleInterface;
- "technically" 是什么意思?他们都工作。如果你想让 ois 知道它是否实现了接口,那就是
is
的目的。如果你想要一个被转换为接口的新变量,那么使用 as
.
is
确定对象是否派生自类型并且 return 是否为布尔值。 as
尝试将对象转换为类型,return 将新变量转换为类型,如果不能则为 null。 (但你从你的问题中知道这一点)。
as
可能需要更长的时间,即使转换有效。
"Is" 运算符允许您检查特定实例是否属于特定类型或继承此类型 wheras 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。
这三种方式都将提供相同的结果,并且花费的时间大致相同,但只有第一种是专门针对您的情况设计的。
当你从一个对象开始时,你只需要知道它的 class 是否实现了给定的接口,第一种方法(即 is
运算符)是最合适的.
第二种方法适用于需要查明对象是否是接口的实现的情况,和也在将对象转换为接口后使用该对象。如果您打算在 null
检查后丢弃转换结果,那么首先执行转换就没有意义了。
当你有一个 System.Type
对象而不是对象本身时,第三种方法主要用于反射。
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
:
- 应该用于确定对象是实现接口还是特定类型,所以这就是我的问题的答案:哪个是最佳实践?
运算符as
:
- 应该比
is
花费的时间更长。
- 通常用于将对象存储到代表正确类型的
var
中。
- 用于进一步处理对象。调用函数或检查接口类型。
运算符isAssignableFrom
:
- 检查对象是否可以转换为另一种类型。
- 如果对象的类型在运行时未知,则应使用。
我是 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;
}
}
目标:确定对象 o 是否实现了给定的接口定义IExampleInterface
。
题目:
- 哪种实施是最佳做法?
- 先不管第一个问题,哪一个在技术上是最正确的?
- 运算符的具体区别是什么? MSDNAA 并没有真正详细地介绍它们。
- 哪个通话时间最长/最短?
- var impInterface = obj 是 ISampleInterface;
- "technically" 是什么意思?他们都工作。如果你想让 ois 知道它是否实现了接口,那就是
is
的目的。如果你想要一个被转换为接口的新变量,那么使用as
. is
确定对象是否派生自类型并且 return 是否为布尔值。as
尝试将对象转换为类型,return 将新变量转换为类型,如果不能则为 null。 (但你从你的问题中知道这一点)。as
可能需要更长的时间,即使转换有效。
"Is" 运算符允许您检查特定实例是否属于特定类型或继承此类型 wheras 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。
这三种方式都将提供相同的结果,并且花费的时间大致相同,但只有第一种是专门针对您的情况设计的。
当你从一个对象开始时,你只需要知道它的 class 是否实现了给定的接口,第一种方法(即 is
运算符)是最合适的.
第二种方法适用于需要查明对象是否是接口的实现的情况,和也在将对象转换为接口后使用该对象。如果您打算在 null
检查后丢弃转换结果,那么首先执行转换就没有意义了。
当你有一个 System.Type
对象而不是对象本身时,第三种方法主要用于反射。
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
:
- 应该用于确定对象是实现接口还是特定类型,所以这就是我的问题的答案:哪个是最佳实践?
运算符as
:
- 应该比
is
花费的时间更长。 - 通常用于将对象存储到代表正确类型的
var
中。 - 用于进一步处理对象。调用函数或检查接口类型。
运算符isAssignableFrom
:
- 检查对象是否可以转换为另一种类型。
- 如果对象的类型在运行时未知,则应使用。