在c#.net中更快(obj as Struct!= null)或(obj是Struct)

时间:2012-10-22 10:48:51

标签: c# .net

什么是更快

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?

5 个答案:

答案 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也是如此,并且两者都将检查为空)。