我有一個帶有靜態串列的類,如下所示:
public class Context
{
private static readonly List<Definition> definitions;
static Context()
{
definitions = LoadXML("path-to-xml-file.xml"));
}
public static List<Definition> GetDefinitions()
{
return definitions;
}
}
我的問題是呼叫GetDefinitions()似乎是通過參考而不是按值回傳串列,因為當我在代碼的其他地方執行此操作時:
var defs = Context.GetDefinitions().ToList();
defs.ForEach(a =>
{
a.Name = a.Alias ?? a.Name;
});
所有后續呼叫都Context.GetDefinitions()將回傳修改后的串列 - 而不是原始串列,因此我的結論defs不是值而是對definitions串列的參考。
我嘗試添加.ToList()以試圖解耦參考,但我仍然得到相同的結果。
我也愿意接受一種解決方法,它允許我使用.Select()而不是.ForEach()在我的示例代碼中。
uj5u.com熱心網友回復:
問題是串列不存盤專案本身,而是對專案的參考。即使您創建了一個新串列(例如使用ToList()),參考的專案也保持不變。
為了解決這個問題,您需要克隆串列中的專案,以便擁有資料的獨立副本。您可以ICloneable在專案上實作并使用回傳串列,如下所示:
public static List<Definition> GetDefinitions()
{
return definitions.Select(x => (Definition)x.Clone()).ToList();
}
這樣,您將創建一個包含克隆專案的新串列。但是,如果您需要克隆深度嵌套的類結構,則克隆專案是一項繁瑣的任務。對于平面結構,使用MemberwiseClone是一種簡單的方法。
uj5u.com熱心網友回復:
您需要回傳新串列
public static List<Definition> GetDefinitions()
{
return definitions;
}
將代碼更改為
public static List<Definition> GetDefinitions()
{
return definitions.ToList();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510635.html
標籤:C#林克
