2015-12-02 58 views
0

對不起,標題很難說。請看我的例子。
GetUser1和GetUser2之間有什麼區別嗎?創建對象之間有任何區別,然後返回它或直接創建並返回它?

class Program 
{ 
    static void Main(string[] args) 
    { 
     GetUser1(); 
     GetUser2(); 
    } 

    private static User GetUser1() 
    { 
     return new User 
    { 
      Name = "Hello" 
    }; 
    } 

    private static User GetUser2() 
    { 
     User user = new User 
     { 
      Name = "Hello" 
     }; 
     return user; 
    } 
} 

public class User 
{ 
    public string Name { get; set; } 
} 

一位朋友說:沒有區別。
但我說的是;兩種方法是有區別的。 GetUser2正在創建一個不需要的新對象。並且GetUser2有輕微(很小)的性能錯誤,因爲你正在創建一個新的對象......那是什麼原因?我怎樣才能研究這個話題?

UPDATE
非常感謝你的答案...所以我繼續問;
如果GetUser1和GetUser2之間沒有區別,爲什麼roslyn編譯這樣的代碼(link);

private static User GetUser1() 
{ 
    return new User { 
     Name = "Hello" 
    }; 
} 
+3

不,沒有區別。 GetUser1只是GetUser2的一個更簡潔的版本。 –

+2

不,沒有差別因爲您在兩種方法 –

+0

中都創建了一個新實例。事實上,我敢打賭,CIL對於兩者都是相同的。 –

回答

8

沒有差異發佈模式編譯時。如果您在調試模式中查看發射的IL,則會發現在返回對象之前用於存儲和加載該變量的附加stloc/ldloc instruction形式的細微差異。

如果你看一下the generated compiler code,你會得到兩個相同的結果:

private static void Main(string[] args) 
{ 
    Program.GetUser1(); 
    Program.GetUser2(); 
} 
private static User GetUser1() 
{ 
    return new User { 
     Name = "Hello" 
    }; 
} 
private static User GetUser2() 
{ 
    return new User { 
     Name = "Hello" 
    }; 
} 

而且the generated IL code兩種:

.method private hidebysig static 
    class User GetUser1() cil managed 
{ 
    // Method begins at RVA 0x2068 
    // Code size 17 (0x11) 
    .maxstack 8 

    IL_0000: newobj instance void User::.ctor() 
    IL_0005: dup 
    IL_0006: ldstr "Hello" 
    IL_000b: callvirt instance void User::set_Name(string) 
    IL_0010: ret 
} // end of method Program::GetUser1 

.method private hidebysig static 
    class User GetUser2() cil managed 
{ 
    // Method begins at RVA 0x2068 
    // Code size 17 (0x11) 
    .maxstack 8 

    IL_0000: newobj instance void User::.ctor() 
    IL_0005: dup 
    IL_0006: ldstr "Hello" 
    IL_000b: callvirt instance void User::set_Name(string) 
    IL_0010: ret 
} // end of method Program::GetUser2 
+0

夥計們,對於可能看起來很愚蠢的問題抱歉。 IL代表什麼? Thanx – user449689

+0

@ user449689 It(MSIL/CIL)代表[Microsoft中間語言/通用中間語言](https://en.wikipedia.org/wiki/Common_Intermediate_Language) –

+1

您的代碼在兩種情況下都是相同的。我認爲這是一個切斷和過去的錯誤? – ChrisF

5

有一個在調試一個微小的差異建立無抖動的優化,因爲冗餘不會被刪除,因此您可以更輕鬆地檢查調試器中的值。

發佈版本將刪除它,並且抖動優化也可以這樣做,所以在調試情況之外,兩者是相同的。

2

兩種方法是有區別的。 GetUser2正在創建一個不需要的新對象。並且GetUser2有輕微(很小)的性能錯誤,因爲您正在創建一個新對象。

Both方法正在創建一個新的對象。使用中間變量(User user)的方法只增加:a 變量,它只是一個指向同一對象的指針。

只要方法超出範圍,該變量就不存在了。

即使在調試模式下,堆棧上的一個變量的差異也是可以忽略的。

相關問題