1、設置鏈表,通常代碼如下:
public struct Links
{
public int data;
public Links next;
}
上面的代碼編譯時會出錯:“Links”類型的結構成員“Links.next”在結構布局中導致循環
解決方法有2個:
a、不用struct,改用class就ok了
b、堅持使用struct,那麼需要折衷一下,加一個object成員和Links屬性來曲線救國,代碼如下:
public struct Links
{
public int data;
private object _next;
public Links next
{
get { return (Links)_next; }
set { _next = value; }
}
}
2、對struct數組或類的struct成員賦值,示例代碼:
List<Links> arr = new List<Links>();
arr.Add(new Links());
arr[0].data = 123;
上面的代碼編譯時出錯:無法修改“System.Collections.Generic.List<Links>.this[int]”的返回值,因為它不是變量
出錯的原因,是因為struct是值類型,首先arr[0]返回了一個Links,返回的只是一個副本,並不是arr數組裡的0這個位置的引用,
直接對副本的data屬性進行修改,是沒有任何意義的,因為修改完成後,這個副本就被拋棄了
為了避免開發者犯這個錯誤,微軟就把它定義為編譯錯誤了, 如果是希望修改數組裡第0個元素的data屬性,代碼改成:
List<Links> arr = new List<Links>();
arr.Add(new Links());
Links tmp = arr[0];
tmp.data = 123;
arr[0].data = tmp;
上面這一步是把第0個元素直接整個替換,舊的數據等待回收中