我有一个程序,它首先遍历文件数据,然后将(JSON)数据转换为Object。对象取决于我尝试访问数据的文件。对于我要问的问题,这几乎是无关。
当我完成项目,并准备将其发送给我的朋友时,我发现有一件事我对C#的List<>
没有了解。
以下是我使用的代码:
// File is not empty!
string file = File.ReadAllText(new MainWindow().getFileName("events"));
List<Event> events = JsonConvert.DeserializeObject<List<Event>>(file);
在此之后,我尝试在我遇到的每个事件中填充ListView
,或者我尝试使用文字填充TextBlock
,现在没有事件创建一个。
我正在使用这种情况。
if(events != null) {
// goes well
} else {
// populate the code text view
}
在此代码中,else块不会被触发。如果有事件,它会填充列表,否则它只会跳过textView更新代码。
但是,如果我使用此代码,
if(events.Count != 0) {
// listview code..
} else {
// populate text view
}
使用它,我可以填充textView,我可以在页面中看到错误消息。
我已经添加了代码图像,以及它的工作示例。希望有人可以告诉我差异
(List.Count == 0) || (List == null)
/* irrelevant piece of code, I'm trying to ask, should I use
* List Count == 0 OR List is equal to null */
答案 0 :(得分:6)
对于某些列表变量
List<SomeType> list = // initialization
可能会发生变量list
未正确初始化且未设置任何对象的情况。在这种情况下,变量的值为null
。虽然
list == null
评估为true
和list.Count
会抛出NullReferenceException
另一方面,如果可以获得列表。然后,您将能够在列表中调用Count
,该列表告知该列表中的元素数量。虽然
list == null
评估为false
和list.Count == 0
评估为true
;如果列表中至少包含一个元素,则评估为false
。为了安全起见(不仅仅是编程偏执狂),最好检查变量是否为空。我的意思是检查您从中获取对象的API的文档。
如果您知道它可能为null,则需要先检查list == null
来解决这种情况。如果你不知道你可能应该检查null
。我建议检查null
,如果是,请在列表中指定一个空列表。
List<SomeType> list = // initialization
list = (list == null) ? new List<SomeType>() : list;
if(list.Count == 0)
// do whatever you like here
else
// or even here
或者将初始化放入另一个专门用于检索列表的方法中。如果它以某种方式失败,则返回一个空列表。这样,您只需检查一个条件即可处理以下所有代码。条件list.Count == 0
。
List<SomeType> RetrieveList()
{
List<SomeType> list = // initialization possibly null
return (list == null) ? new List<SomeType>() : list;
}
希望这有帮助
答案 1 :(得分:2)
documentation并未说明JsonConvert.DeserializeObject
的实际回报值。
但似乎List<Event> events = JsonConvert.DeserializeObject<List<Event>>(file);
从未将事件设置为null,这就是您的代码
if(events != null) {
// goes well
} else {
// populate the code text view
}
没有做它应该做的事情。
但它(JsonConvert
)可以返回一个空列表。这就是为什么这些代码能够实现它应该完成的目标:
if(events.Count != 0) {
// listview code..
} else {
// populate text view
}
因为如果解析失败JsonConvert.DeserializeObject
,则返回空列表。
好吧,(List.Count == 0) || (List == null)
应该写成(List == null) || (List .Count == 0)
,因为如果列表以某种方式变为空,则会出现意外的NulReferenceException
。有关详细信息,请参阅Execution order of conditions in C# If statement
JsonConvert
的行为可能会发生变化,因此最好使用
if ((events == null) || (events.Count == 0)) {
// Error handling - populate text view
} else {
// Everything is ok - listview code..
}