【问题标题】:How to fix 'error CS0165: Use of unassigned local variable' in XmlReader Switch Case如何修复 XmlReader Switch Case 中的“错误 CS0165:使用未分配的局部变量”
【发布时间】:2019-06-29 05:40:08
【问题描述】:

我尝试从 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 和 switch case 的指南,所以我尝试了一下。

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 Code 给了我一个错误: 错误 CS0165:使用未分配的局部变量 'student'(如果是“name”,则为student.name)。我想这是因为如果代码没有进入“学生”的情况,就不会有 student.name 。我尝试使用 try catch 但这对我没有帮助。

我怎样才能让每个学生的姓名和学期都正确?

【问题讨论】:

标签: c# xml xmlreader


【解决方案1】:

您只能在"student" 的情况下分配 student;从编译器的角度来看,student"name""semester" 案例的开头是未分配的,因此您不能在它们上设置属性。您可能知道&lt;student&gt; 总是在第一位,但编译器 不知道这一点。此外,从它的角度来看,每个元素的范围是分开的。但是,如果您100% 确定每个之间总是有一个 &lt;student&gt;,那么您可能可以稍微移动一下分配:

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;

【讨论】:

  • 我已经删除了类似的答案。考虑到这一点,我更喜欢这个版本,如果违反假设,而不是继续继续,但它仍然只能将您从最初的领先 namesemester 元素中拯救出来。
  • @Damien_The_Unbeliever 我的偏好实际上是我刚刚编辑过的那部分:)
猜你喜欢
  • 2018-12-19
  • 2022-06-16
  • 2021-07-22
  • 2018-07-03
  • 1970-01-01
  • 2019-11-08
  • 2019-12-15
  • 2016-10-09
  • 1970-01-01
相关资源
最近更新 更多