2016-09-22 38 views
1

我已經在C#中的結構應該被視爲不可改變發現很多地方,但我想有人幫助我理解下面的代碼的行爲:增加一個字段在結構數組

public partial class Form1 : Form 
{ 
    private struct SocSearchDomains 
    { 
     public string UrlName; 
     public DateTime LastRequestStampDate; 
     public int ErrorsCount; 

     public SocSearchDomains(string urlName, DateTime requestStampDate) 
     { 
      UrlName = urlName; 
      LastRequestStampDate = requestStampDate; 
      ErrorsCount = 1; 
     } 
    } 

    private static SocSearchDomains[] searchDomain { get; set; } 
    private static SocSearchDomains searchDomain1 { get; set; } 

    public Form1() 
    { 
     InitializeComponent(); 
     searchDomain = new SocSearchDomains[1]; 
     searchDomain[0] = new SocSearchDomains("192.168.1.81", DateTime.Now); 
     searchDomain1 = new SocSearchDomains("192.168.1.81", DateTime.Now); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show(string.Format("SearchDomain[0]: {0}, SearchDomain1: {1}", searchDomain[0].ErrorsCount, searchDomain1.ErrorsCount)); 
     System.Threading.Interlocked.Increment(ref searchDomain[0].ErrorsCount); 
     System.Threading.Interlocked.Increment(ref searchDomain1.ErrorsCount); 
    } 
} 

基本上,當我嘗試增加SearchDomain1.ErrorsCount時,我得到一個「無法修改返回值...因爲它不是一個變量」,但增量爲searchDomain[0].ErrorsCount(當評論聯鎖爲SearchDomain1.ErrorsCount時)工作。 爲什麼這種行爲,並且在多線程應用程序中使用這種聯鎖(在結構數組中)是安全的?

+0

SocSearchDomains是一個結構而不是類的原因是什麼?或者你在製作一個隨機的人造物品示例? –

+0

看這裏,你的情況一樣。你的存儲值類型,而不是引用類型,它意味着數組返回值,而不是引用,你不能改變它:http://stackoverflow.com/questions/1747654/cannot-modify-the-return-value -error-c-sharp –

+0

@Scott,原因是我所需要的只是跟蹤數據,不涉及任何方法(只是構造函數),唯一改變的數據就是計數​​器。所以,也許這是我的誤解,在我的情況下,結構會比使用課堂更輕(在記憶中)。 –

回答

0

響應此行爲的原因Choosing between Class and Struct幫助我回應:「值類型數組是內聯分配的,這意味着數組元素是值類型的實際實例」。現在,對於我的第二個問題,如果它是安全的,我認爲最好遵循使用結構(在同一鏈接中)的規則:如果它是不可變的。所以,我會更好地爲此目的使用一堂課。

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/ review/low-quality-posts/13762240) – ADyson

+0

我認爲,提供一個理由,而不是僅僅說出「它不提供答案」,並刪除我的迴應將爲每個人提供更好的學習機會。 –

+0

當我標記答案時,評論措辭是由Stackoverflow的評論系統自動生成的。如果您花費足夠長的時間,您會在整個網站上看到數千條相同的評論。 FWIW,關於SO的約定是如果你找到自己問題的答案,就更新你的問題。 – ADyson

相關問題