2013-07-08 80 views
-1

我是C#的初學者,並試圖理解在不同作用域中聲明變量的效果。是否有任何之間明顯的性能差異:在另一個類中聲明變量 - 優點和缺點

實施例1

class A 
{ 
    static int i; 
    static string temp; 
} 

class B 
{ 
    while(true) 
    { 
     A.i=10; 
     A.temp="Hello"; 
    } 
} 

實施例2

class B 
{ 
    int i; 
    string temp; 
    while(true) 
    { 
     i=10; 
     temp="Hello"; 
    } 
} 

實施例3

class A 
{ 
    public int i; 
    public string temp; 
} 

class B 
{ 
A D = new A(); 
    while(true) 
    { 
     D.i=10; 
     D.temp="Hello"; 
    } 
} 
+0

此代碼實際上並不編譯 –

+0

沒有實際的性能差異。只需編寫看起來最清晰的代碼即可。 – Blorgbeard

回答

3

第一個代碼片段共享兩個變量:它們被靜態分配,並且所有線程都將在併發環境中使用它們。這非常糟糕 - 應該避免在生產代碼中出現這種情況。

第二個和第三個代碼片段是線程安全的。第三個片段組變量itemp;第二個片段沒有。另外,第三個片段需要額外分配一個對象,並在返回時創建一個要收集的對象(當然,由於無限循環,它永遠不會返回,所以它並不重要)。

如果兩個變量在邏輯上不在一起,則應該避免爲它們創建一個類。如果它們確實屬於一起,則應將使用這些變量的代碼移到聲明它們的類中。

就性能和內存的影響而言,第三個片段與第二個片段相比需要額外的一塊內存,但它太小而無法關注。性能差異將幾乎無法檢測到,因此您不應該擔心這一點:在大多數情況下,最好優化代碼的可讀性。

+0

*「......靜態......應該避免在生產代碼中出現這種情況。」*在這種情況下,這是一個非常廣泛的陳述,你不覺得嗎? –

+0

@MichaelBray假設類是公開可見的,並且它的所有靜態變量都是可變的,那麼該語句就是正確的。當然,有些情況下,一個可變的全球化是合理的,但它們之間的距離非常罕見,幾乎不值一提。我曾在一家公司工作,只有在首席設計師的書面許可下才允許引入可變全局。在我擔任公司四年的時間裏,我們團隊中沒有人要求獲得這樣的許可。 – dasblinkenlight

+0

我的觀點並不是你的陳述的準確性或合理性。這是OP對於開發來說顯然是新的,甚至提到了它的一個觀點,並且你正在向他拋出線程安全性和併發性。這就像邁克爾喬丹試圖教我的貓打籃球一樣。我認爲這個人會永遠被推遲到靜止,認爲它總是不好,當它不是。 –