2014-02-21 24 views
1

假設我有一個對象:通過參數傳遞直接向成員構造函數的語法

public class A 
{ 
    private int m_a; 
    private int m_b; 
    A(int a, int b) 
    { 
     m_a = a; 
     m_b = b; 
    } 
} 

這幹得不錯,但我被告知一個朦朧的記憶是不必要的複製整數到參數a和b然後轉換爲m_a和m_b。有沒有辦法定義這個類,使參數直接傳遞給它們的成員?

請注意,我不想討論C# Object Constructor - shorthand property syntax,因爲這裏的責任在於使用該課程的人。

當然,我可能是完全錯誤的,也許編譯器會消除這樣的瑣碎,因此我應該很樂意接受任何方式的教育。

+0

我不相信有什麼辦法做到你的要求。 – Ian

+8

如果此代碼的性能是您的應用程序的瓶頸,我羨慕你。 –

+0

請不要在標題中包含languge標籤,除非在沒有標籤的情況下沒有意義。標籤用於此目的。 –

回答

1

我想你在考慮C++成員初始化列表。

+0

我認爲你是對的:-) – Robino

6

這個工程,但我有一個朦朧的記憶被告知它不必要地將整數複製到參數a和b,然後到m_a和m_b。

是,這些值被複制到參數ab,然後到對象本身的狀態。

基本上這只是成員調用的一部分,並且是不可避免的。未來的C#版本可能會有一種方法可以使源代碼中的表達更加簡單,但存在的「開銷」仍然存在 - 並且在廣大絕大多數程序中完全無關緊要。 (它可能由JIT編譯器通過內聯進行優化,實際上...但你幾乎肯定不會擔心它。)

1

我能想到的唯一的事情就是使用ref,它將像指針一樣工作在C++中,但是這不是你想用我猜,因爲它有一些其他影響的東西......

而且,他們不防止複製的第二步int(設置m_a

1

如果需要在構造函數中分配很多這樣的字段,最好的方法是使用結構來傳遞參數並存儲值。

最後,您必須提供您的參數值,無論是將它們存儲在結構中,還是將它們明確地作爲構造函數參數傳遞。但是如果你不必一直使用這些值,那麼它會讓你省去很多時間。

1

構造函數在C#中的設計方式由於.NET的內存處理,我無法確定這可能是怎麼樣的。

public void Foo() 
{  
    var a = new A(1,2); 
    //The 1 and 2 values can safely be removed from memory here. 
} 
public class A 
{ 
    int _a; 
    int _b; 
    public A(int a, int b) 
    { 
     _a = a; 
     _b = b; 
    } 
} 

當構造函數參數從內存中移除時,您不會因爲不必要地複製整數而造成內存混濁。想想存儲字段所需的生命週期。 在這種情況下,只需要將1和2存儲到執行器中。但是_a和_b將存在於對象a的生命週期中。這意味着你需要有一些方法將構造函數中的參數提升到類或屬性的字段中,以便將它們保存在a的生命週期中。

我想,這可能會清除掉你 http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx

相關問題