C# 迭代StreamReader对象列表时出现空引用异常

C# 迭代StreamReader对象列表时出现空引用异常,c#,.net,file-io,nullreferenceexception,streamreader,C#,.net,File Io,Nullreferenceexception,Streamreader,我正在制作一个简单的程序,在一组文件中搜索一个特定的名称。我有大约23个文件要处理。为了实现这一点,我使用了StreamReader类,因此,为了编写更少的代码,我做了一个 List<StreamReader> FileList = new List<StreamReader>(); 我已经打开了文件列表中的所有流。问题是我得到了一个 空引用异常 在while循环中的条件下 有谁能告诉我我在这里犯了什么错误,为什么会出现此异常,以及我可以采取哪些步骤来纠正此问题?如上所

我正在制作一个简单的程序,在一组文件中搜索一个特定的名称。我有大约23个文件要处理。为了实现这一点,我使用了
StreamReader
类,因此,为了编写更少的代码,我做了一个

List<StreamReader> FileList = new List<StreamReader>();
我已经打开了文件列表中的所有流。问题是我得到了一个

空引用异常

在while循环中的条件下


有谁能告诉我我在这里犯了什么错误,为什么会出现此异常,以及我可以采取哪些步骤来纠正此问题?

如上所述,请使用以下方法:

using (StreamReader sr = new StreamReader("filename.txt"))
{
    ...
}
如果您试图将文件名存储在列表中,我建议您使用字典:

Dictionary<string, string> Files = new Dictionary<string, string>();

using (StreamReader sr = new StreamReader("filename.txt"))
{
   string total = "";
   string line;
   while ((line = sr.ReadLine()) != null)
   {
      total += line;
   }
   Files.Add("filename.txt", line);
}
或者,如果您想让StreamReader本身而不是文件文本,可以使用:

Dictionary<string, StreamReader> Files = new Dictionary<string, StreamReader>();

using (StreamReader sr = new StreamReader("filename.txt"))
{
    Files.Add("filename.txt", sr);
}
字典文件=新字典();
使用(StreamReader sr=newstreamreader(“filename.txt”))
{
添加(“filename.txt”,sr);
}

使用块将代码扭曲到
内部,它将销毁所有未清理的对象。
文件列表中是否有空引用?堆栈跟踪到底是什么样子的?@Khushi您能详细解释一下吗?因为我是C#@Khushi新手:使用
语句将确保调用
Dispose
。它实际上不会破坏这些物体。@JonSkeet,这是我的错误。谢谢你提到它。谢谢你的回答,你能告诉我为什么会出现空引用异常吗?@Patrik这一切都取决于你的StreamReaders代码部分,你可能已经关闭了StreamReaders,保持StreamReader(文件)打开并不是一个好主意,因为它会让它在使用时打开,并且不允许任何其他应用程序使用它,最好的方法是从中收集您想要的内容(字符串),然后关闭,将字符串保存到内存中。你不应该让它们永远开着。确保处置();所谓最好的方法就是使用using格式。同样的方法也适用于StreamWriter。谢谢你的建议。因为有很多文件,我又做了两个函数来跟踪流的打开和关闭,所以一旦调用此函数,我就调用close函数,因此在声明
sr
的情况下,流不会保持打开状态,您不能使用
块将其放入
中,因为这使得
StreamReader
毫无用处。
Console.WriteLine("Filename.txt has: " + Files["filename.txt"]);
Dictionary<string, StreamReader> Files = new Dictionary<string, StreamReader>();

using (StreamReader sr = new StreamReader("filename.txt"))
{
    Files.Add("filename.txt", sr);
}