C# IS vs.AS vs.IsAssignableFrom-检查对象类型和接口时有什么区别?
我对C#有点陌生,不知道你能不能帮我一下 场景: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) {
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并没有真正详细地介绍它们
- 哪个通话时间最长/最短
的作用。如果您想要一个新变量作为接口转换,则使用作为
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对象而不是对象本身时。即使对于泛型,它也有一些用途……哎呀,我的错。不,反射在其中不起作用。