【发布时间】:2016-02-21 15:31:29
【问题描述】:
我在我的 Winforms 应用程序中使用了一个通用列表,并且在整个代码中我将首先检查底层 (json) 文件是否存在,如果存在,则对其进行反序列化,然后访问反序列化的通用列表。我决定将代码放在一个地方会更好,所以这样做了:
public static List<AssignmentHistory> assignmentHistList
{
get { return GetAssignmentHistoryList(); }
}
public static List<AssignmentHistory> GetAssignmentHistoryList()
{
if (!System.IO.File.Exists(ASSIGNMENT_HISTORY_FILENAME)) return null;
if (null == assignmentHistList)
{
return DeserializeAssignmentHistFile();
}
return assignmentHistList;
}
public static List<AssignmentHistory> DeserializeAssignmentHistFile()
{
var assignmentHistFile = System.IO.File.ReadAllText(ASSIGNMENT_HISTORY_FILENAME);
var assignmentHistDeserialized = JsonConvert.DeserializeObject<List<AssignmentHistory>>(assignmentHist);
return assignmentHistDeserialized;
}
然后我这样称呼它:
AssignmentHistory ah =
AYttFMConstsAndUtils.assignmentHistList.FirstOrDefault(
i => i.WeekOfAssignment == currentWeek && i.TalkType == 1);
...但永远不要超过那条线,因为 GetAssignmentHistoryList() 被一遍又一遍地调用,直到堆栈溢出。我在这里做错了什么?
更新
我使用了 abto 的 null 合并运算符建议,但为了防止出现空文件的可能性,我还必须修改我的 Deserialize 方法,以便它现在是:
private static List<AssignmentHistory> DeserializeAssignmentHistFile()
{
List<AssignmentHistory> assignmentHistoryList;
if (!System.IO.File.Exists(ASSIGNMENT_HISTORY_FILENAME))
{
var assignmentFile = System.IO.File.Create(ASSIGNMENT_HISTORY_FILENAME);
assignmentFile.Close();
}
var assignmentHistFile = System.IO.File.ReadAllText(ASSIGNMENT_HISTORY_FILENAME);
var assignmentHistDeserialized = JsonConvert.DeserializeObject<List<AssignmentHistory>>(assignmentHistFile);
if (null != assignmentHistDeserialized) return assignmentHistDeserialized;
assignmentHistoryList = new List<AssignmentHistory>();
return assignmentHistoryList;
}
【问题讨论】:
-
你看到
assignmentHistList和GetAssignmentHistoryList之间的循环引用了吗?使用调试器单步执行它,您会发现您不断在两者之间切换。 -
在您的
GetAssignmentHistoryList()中,您返回您的assignmentHistList属性,该属性本身返回的是GetAssignmentHistoryList()的结果。 -
GetAssignmentHistoryList 读取属性“assignmentHistList”,其获取函数调用 GetAssignmentHistoryList。如果您使用 F11 单步执行代码,则应该很明显。
标签: c# linq json.net getter accessor