我已經在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
時)工作。 爲什麼這種行爲,並且在多線程應用程序中使用這種聯鎖(在結構數組中)是安全的?
SocSearchDomains是一個結構而不是類的原因是什麼?或者你在製作一個隨機的人造物品示例? –
看這裏,你的情況一樣。你的存儲值類型,而不是引用類型,它意味着數組返回值,而不是引用,你不能改變它:http://stackoverflow.com/questions/1747654/cannot-modify-the-return-value -error-c-sharp –
@Scott,原因是我所需要的只是跟蹤數據,不涉及任何方法(只是構造函數),唯一改變的數據就是計數器。所以,也許這是我的誤解,在我的情況下,結構會比使用課堂更輕(在記憶中)。 –