我是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
。
问题:
答案 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)
is
的用途。如果您想要一个新的变量作为接口,那么请使用as
。is
确定对象是否从类型派生并返回布尔值。 as
尝试将对象转换为类型,并将新变量强制转换为该类型,如果不能,则返回null。 (但你从问题中知道这一点)。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
: