如何修复 XmlReader Switch Case 中的 'error CS0165: Use of unassigned local variable'
How to fix 'error CS0165: Use of unassigned local variable' in XmlReader Switch Case
我尝试从 Xml 文件中读取数据。
我的计划是将所有学生保存为具有名称和学期的学生对象。
<persons>
<student><name>255211</name><semester>MI</semester></student>
<student><name>255212</name><semester>MI</semester></student>
<student><name>255213</name><semester>MI</semester></student>
</persons>
我找到了一个带有 XmlReader 和开关盒的指南,所以我试了一下。
private static void readData()
{
XmlTextReader reader = new XmlTextReader("data.xml");
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
case "student":
Student student = new Student();
Students.Add(student);
break;
case "name":
student.name = reader.ReadString();
//Console.WriteLine(student.name);
break;
case "semester":
student.semester = reader.ReadString();
break;
}
}
}
reader.Close();
}
我现在的问题是 Visual Studio 代码给我一个错误:
错误 CS0165:使用未分配的局部变量 'student'(在 "name" 的情况下为 student.name)。我想这是因为如果代码不进入案例 "student",就不会有 student.name。我尝试使用 try catch 但这对我没有帮助。
我怎样才能让每个学生的名字和学期都正确?
在 "student"
的情况下,您只能 分配 student
;从编译器的角度来看,student
在 "name"
和 "semester"
情况的开头未分配,因此您无法在它们上设置属性。您可能知道 <student>
始终排在第一位,但 编译器 不知道这一点。此外,从它的角度来看,每个元素的作用域都是独立的。但是,如果您 100% 确定 两者之间总是有一个 <student>
,那么您可以稍微移动一下作业:
Student student = null;
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
case "student":
student = new Student();
Students.Add(student);
break;
case "name":
student.name = reader.ReadString();
//Console.WriteLine(student.name);
break;
case "semester":
student.semester = reader.ReadString();
break;
}
}
}
但实际上,在大多数情况下,我强烈建议使用XmlSerializer
或类似的方法将输入解析为对象,然后将它们作为对象处理。
根据问题中的 xml 布局,这应该可行:
public class Student {
[XmlElement("name")]
public string Name {get;set;}
[XmlElement("semester")]
public string Semester {get;set;}
}
[XmlRoot("persons")]
public class SomeData {
[XmlElement("student")]
public List<Student> Students {get;} = new List<Student>();
}
和:
var ser = new XmlSerializer(typeof(SomeData));
var data = (SomeData)ser.Deserialize(source);
List<Student> students = data.Students;
我尝试从 Xml 文件中读取数据。 我的计划是将所有学生保存为具有名称和学期的学生对象。
<persons>
<student><name>255211</name><semester>MI</semester></student>
<student><name>255212</name><semester>MI</semester></student>
<student><name>255213</name><semester>MI</semester></student>
</persons>
我找到了一个带有 XmlReader 和开关盒的指南,所以我试了一下。
private static void readData()
{
XmlTextReader reader = new XmlTextReader("data.xml");
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
case "student":
Student student = new Student();
Students.Add(student);
break;
case "name":
student.name = reader.ReadString();
//Console.WriteLine(student.name);
break;
case "semester":
student.semester = reader.ReadString();
break;
}
}
}
reader.Close();
}
我现在的问题是 Visual Studio 代码给我一个错误: 错误 CS0165:使用未分配的局部变量 'student'(在 "name" 的情况下为 student.name)。我想这是因为如果代码不进入案例 "student",就不会有 student.name。我尝试使用 try catch 但这对我没有帮助。
我怎样才能让每个学生的名字和学期都正确?
在 "student"
的情况下,您只能 分配 student
;从编译器的角度来看,student
在 "name"
和 "semester"
情况的开头未分配,因此您无法在它们上设置属性。您可能知道 <student>
始终排在第一位,但 编译器 不知道这一点。此外,从它的角度来看,每个元素的作用域都是独立的。但是,如果您 100% 确定 两者之间总是有一个 <student>
,那么您可以稍微移动一下作业:
Student student = null;
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
case "student":
student = new Student();
Students.Add(student);
break;
case "name":
student.name = reader.ReadString();
//Console.WriteLine(student.name);
break;
case "semester":
student.semester = reader.ReadString();
break;
}
}
}
但实际上,在大多数情况下,我强烈建议使用XmlSerializer
或类似的方法将输入解析为对象,然后将它们作为对象处理。
根据问题中的 xml 布局,这应该可行:
public class Student {
[XmlElement("name")]
public string Name {get;set;}
[XmlElement("semester")]
public string Semester {get;set;}
}
[XmlRoot("persons")]
public class SomeData {
[XmlElement("student")]
public List<Student> Students {get;} = new List<Student>();
}
和:
var ser = new XmlSerializer(typeof(SomeData));
var data = (SomeData)ser.Deserialize(source);
List<Student> students = data.Students;