-2

什么更快

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'然后是空检查,然后使用'is'然后是直接投射?

4

5 回答 5

6

as运算符不适用于值类型(structs),因此如果您有

struct SomeStruct { }

object obj = new SomeStruct();

那么找出类型并取消装箱值的唯一选择是

if (obj is SomeStruct)
{
    SomeStruct val = (SomeStruct)obj;
于 2012-10-22T10:53:02.147 回答
2

它们都是一样的,没有区别 (我希望它是一个类而不是结构,在你的问题中,否则它不会编译)

假设你有:

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 托管

{
  .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
于 2012-10-22T10:56:43.380 回答
1

当您想检查是否obj是时AnswerStruct,您到底怎么能比:

if(obj is AnswerStruct)

如果您非常关心微优化,那么您应该做的第一件事就是使用非托管语言。除了实际上没有什么比这段代码更快的事实之外,正如dtb 在他的回答中所写的那样,有时这是唯一可行的变体。不要为了获得毫无价值的速度而牺牲清晰度,尤其是在根本没有收益的情况下。

于 2012-10-22T11:10:31.100 回答
0

假设您打算谈论课程

它们是等价的,因为它们编译成相同的字节码。

as运算符只是调用isinst运算符,而运算is符调用isinst,然后检查 null,就像您所做的那样。

于 2012-10-22T10:55:09.943 回答
0

这是两种方式,但相同的调用过程都需要相同的时间(因为操作员调用isinst操作员并且与 is 操作员调用相同,isinst并且两者都将检查是否为空)。

于 2012-10-22T11:13:01.193 回答