2012-10-22 59 views
-2

什麼是快什麼是快(OBJ作爲結構!= NULL)或(obj是結構)在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'然後空檢查,然後使用'is',然後直接Cast?

+4

有非常有用的類('System.Diagnostics.Stopwatch')來分析這樣的事情。 – Leri

+3

如果這確實是應用程序性能的瓶頸,那麼問題就更加深入了。 –

+0

您應該閱讀以下內容:http://www.codinghorror.com/blog/2009/01/the-sad-tragedy-of-micro-optimization-theater.html –

回答

6

as運營商不與值類型(struct S)工作,所以如果你有

struct SomeStruct { } 

object obj = new SomeStruct(); 

那麼唯一的選擇,找出類型和拆箱值

if (obj is SomeStruct) 
{ 
    SomeStruct val = (SomeStruct)obj; 
+2

正確。他可以說'var answer = obj as AnswerStruct?如果(answer.HasValue){...}'但這是慢[根據性能驚訝與「爲」和可爲空類型](http://stackoverflow.com/questions/1583050/)。 –

0

假設你打算談論類

他們是等價的,因爲他們編譯做對相同的字節碼。

as操作員只需調用isinst運營商,而運營商is調用isinst,然後檢查空,就像你一樣。

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"); 
    } 
} 

這裏是IL從ILDASM

。方法私人hidebysig靜態無效的主要(字串[] 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 
+0

結構也是一樣的嗎? – Kobi

+0

@Kobi,我沒有用struct來試過,我相信我不能在結構/值類型中使用'!= null'。關鍵字'as'也不適用於值類型 – Habib

1

當你想檢查是否objAnswerStruct,如何在地球上,你可以更清晰:

if(obj is AnswerStruct) 

如果你是所以關注微觀優化,你應該做的第一件事就是使用非託管語言。除此之外,實際上並沒有比這段代碼更快的事實,並且,如dtb wrote in his answer,有時這是唯一可行的變體。不要在速度上犧牲清晰度來獲得無價值的收益,特別是在沒有收益的情況下。

0

這兩種方式,但相同的呼叫過程都是相同的時間(因爲運營商呼叫isinst運營商和運營商呼叫isinst相同,都將檢查爲空)。