什么是更快
AnswerClass ansClass = obj as AnswerClass;
if(ansClass != null){
//use ansClass directly
}
或
if(obj is AnswerClass ){
AnswerClass ansClass = (AnswerClass) obj;
//use ansClass now
}
在C#.net。
我环顾四周但找不到任何可以解答的问题,这里有人知道吗?
我已编辑以更好地解释我的问题,它是比较'as'然后null检查,然后使用,'is'然后直接Cast?
答案 0 :(得分:6)
as
运算符不适用于值类型(struct
s),所以如果你有
struct SomeStruct { }
object obj = new SomeStruct();
然后找出类型和取消装箱值的唯一选择是
if (obj is SomeStruct)
{
SomeStruct val = (SomeStruct)obj;
答案 1 :(得分:2)
它们都是一样的,没有区别 (我希望它的一个类不是一个结构,在你的问题中,否则就不会编译) < / p>
假设你有:
class Test
{
public int MyProperty { get; set; }
public int SomeOther { get; set; }
}
class Program
{
static void Main(string[] args)
{
object obj = new Test();
if (obj as Test != null)
{
Console.WriteLine("test1");
}
if (obj is Test)
{
Console.WriteLine("test2");
}
}
如果您在ILSpy中查看代码。
private static void Main(string[] args)
{
object obj = new Test();
if (obj is Test)
{
Console.WriteLine("test1");
}
if (obj is Test)
{
Console.WriteLine("test2");
}
}
这是来自ildasm的IL
.method private hidebysig static void Main(string [] args)cil managed
{
.entrypoint
// Code size 43 (0x2b)
.maxstack 1
.locals init ([0] object obj)
IL_0000: newobj instance void ILTest.Test::.ctor()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: isinst ILTest.Test
IL_000c: brfalse.s IL_0018
IL_000e: ldstr "test1"
IL_0013: call void [mscorlib]System.Console::WriteLine(string)
IL_0018: ldloc.0
IL_0019: isinst ILTest.Test
IL_001e: brfalse.s IL_002a
IL_0020: ldstr "test2"
IL_0025: call void [mscorlib]System.Console::WriteLine(string)
IL_002a: ret
} // end of method Program::Main
答案 2 :(得分:1)
如果您想检查obj
是否为AnswerStruct
,那么您在地球上的表现会比以下更清楚:
if(obj is AnswerStruct)
如果您对微观恐吓如此关注,首先应该使用非托管语言。除了事实上没有比这段代码更快的事实,而dtb wrote in his answer,有时这是唯一可行的变体。不要因为速度毫无价值而牺牲清晰度,特别是在没有任何收获的情况下。
答案 3 :(得分:0)
假设您打算谈论课程
它们是等价的,因为它们编译成相同的字节码。
as
运算符只需调用isinst
运算符,而is
运算符调用isinst
,然后检查null,就像您一样。
答案 4 :(得分:0)
这两种方式是相同的,但是同一个调用过程都需要相同的时间(因为运算符调用isinst
运算符,运算符调用isinst
也是如此,并且两者都将检查为空)。