如何初始化嵌套数组

时间:2016-04-27 13:30:52

标签: c# arrays multidimensional-array types nested

原谅一个愚蠢的问题,但我是C#& OOP。

任何人都可以帮我阻止“System.NullReferenceException:”吗?

我正在尝试按照说明进行操作,并使用我们迄今为止学到的东西(数组,类和构造函数)。

我创建了一个StudentSubjects类数组,并将其嵌入到Student类数组中。

我想打印每个学生科目的详细信息。

我可以访问StudentArray[0]字段,但无法访问StudentArray[0].StudentSubjectsArray[0]字段,因为“对象引用未设置为对象的实例”

我花了两周的时间寻找答案但却找不到任何关于如何设置的例子

StudentArray[0].StudentSubjectsArray[0].SubjectName = "Algebra";

任何建议最受赞赏。我的代码在下面......

using System;

namespace Nested_Arrays
{
    public class Program
    {
        static void Main(string[] args)
        {
            Student[] StudentArray = new Student[1];

            Console.WriteLine($"Hello");
            StudentArray[0] = new Student();
            StudentArray[0].StudentName = "Peter";
            StudentArray[0].StudentLocation = "Australia";
            Console.WriteLine($"{StudentArray[0].StudentName,10} {StudentArray[0].StudentLocation,15}");

            StudentArray[0].StudentSubjectsArray[0].SubjectName = "Algebra";
            StudentArray[0].StudentSubjectsArray[0].StudentsResult = "Pass";
            Console.WriteLine($"{StudentArray[0].StudentName,10} {StudentArray[0].StudentLocation,15} {StudentArray[0].StudentSubjectsArray[0].SubjectName,15} {StudentArray[0].StudentSubjectsArray[0].StudentsResult,10}");
            Console.WriteLine($"Goodbye");
        }

        public class Student
        {
            public string StudentName;
            private string studentName
            { get { return studentName; } set { studentName = value; } }

            public string StudentLocation;
            private string studentLocation
            { get { return studentLocation; } set { studentLocation = value; } }

            public StudentSubjects[] StudentSubjectsArray;
            private StudentSubjects[] studentSubjectsArray
            { get { return studentSubjectsArray; } set { studentSubjectsArray = value; } }

            //Constructor
            public Student() { }
        }

        public class StudentSubjects
        {
            public string SubjectName;
            private string subjectName
            { get { return subjectName; } set { subjectName = value; } }

            public string StudentsResult;
            private string studentsResult
            { get { return studentsResult; } set { studentsResult = value; } }

            //Constructor
            public StudentSubjects() { }

        }
    }
}

3 个答案:

答案 0 :(得分:3)

您只需添加以下内容:

StudentArray[0].StudentSubjectsArray = new StudentSubjects[1];
StudentArray[0].StudentSubjectsArray[0] = new StudentSubjects();
// and only then
StudentArray[0].StudentSubjectsArray[0].SubjectName = "Algebra";

答案 1 :(得分:0)

正如其他人所说的那样,你需要在分配数组中的对象之前创建数组,尽管你可以同时做两个。

例如,如果您想在一行中完成所有操作,则可以使用:

Student[] StudentArray = {
    new Student {
        StudentName = "Peter",
        StudentLocation = "Australia",
        StudentSubjectsArray = new[] {
            new StudentSubjects {
                SubjectName = "Algebra",
                StudentsResult = "Pass"
            }
        }
    }
};

答案 2 :(得分:0)

在我看来,一个好的做法是在构造函数中初始化数组。通过这种方式,您确定在使用对象时它不为空。

做类似的事情:

//Constructor
public Student() {
    this.studentSubjectsArray = new StudentSubjects[1];
}