C# 在另一个类中使用一个类中的对象

C# 在另一个类中使用一个类中的对象,c#,class,C#,Class,我有两个班,老师和学生。我试图让老师在学生中使用课堂功能。我遇到的问题是,我需要在Teacher中使用的学生对象的数量是随机的。我以为我在构造函数中找到了这个问题,但我必须在我使用student的每个教师函数中声明新的student对象。这只是创建了一个新的student对象,这对我没有好处。这是我的密码 class Teacher { private bool absence; private bool level; private static int uniqueI

我有两个班,老师和学生。我试图让老师在学生中使用课堂功能。我遇到的问题是,我需要在
Teacher
中使用的学生对象的数量是随机的。我以为我在构造函数中找到了这个问题,但我必须在我使用student的每个教师函数中声明新的student对象。这只是创建了一个新的student对象,这对我没有好处。这是我的密码

class Teacher
{
    private bool absence;
    private bool level;
    private static int uniqueID = 0;
    private ArrayList arrayList = new ArrayList();
    private ArrayList arrayList1 = new ArrayList();
    private int id = 0;
    private int numPages;
    private char present;
    Random random = new Random();
    int randomLevel = random.Next(20, 30);//this line does not work, if I could then I would just use randomLevel in the in the line below for creating my student objects
    Student student = new Student();
    int maybe;

    public Teacher()
    {
        int randomLevel = random.Next(1, 3);
        id = uniqueID;
        absence = false;
        level = (randomLevel % 2 == 0);
        uniqueID++;
        randomLevel = random.Next(20, 30);
        Student[] student = new Student[randomLevel];
        maybe = randomLevel;
        for (int i = 0; i < randomLevel; i++)
        {
            student[i] = new Student();
        }
    }

有没有办法让random在构造函数上方的声明区域工作?

您不能在构造函数或方法之外使用函数调用初始化字段。此外,还应将在构造函数中创建的学生数组提升为类的字段。这样,您就可以在
addPages
方法中访问student数组。

您不能使用构造函数或方法之外的函数调用初始化字段。此外,还应将在构造函数中创建的学生数组提升为类的字段。通过这种方式,您可以在
addPages
方法中访问student数组。

我认为您的问题归结为可变范围,但您提供了相当多的无关代码。我会简化到我认为你真正关心的事情

class Teacher
{
    // class-level list of students
    private List<Student> _students = new List<Student>();

    public Teacher()
    {
        var random = new Random();
        var studentCount = random.Next(20,30);

        for(int i = 0; i < studentCount; i++)
        {
            _students.Add(new Student());
        }
    }

    // use _students from here on out
    public void AddPages(...) { ... }
}
班主任
{
//班级学生名单
私人名单_学生=新名单();
公共教师()
{
var random=新的random();
var studentCount=random.Next(20,30);
for(int i=0;i
我认为您的问题归结为可变范围,但您提供了相当多的无关代码。我会简化到我认为你真正关心的事情

class Teacher
{
    // class-level list of students
    private List<Student> _students = new List<Student>();

    public Teacher()
    {
        var random = new Random();
        var studentCount = random.Next(20,30);

        for(int i = 0; i < studentCount; i++)
        {
            _students.Add(new Student());
        }
    }

    // use _students from here on out
    public void AddPages(...) { ... }
}
班主任
{
//班级学生名单
私人名单_学生=新名单();
公共教师()
{
var random=新的random();
var studentCount=random.Next(20,30);
for(int i=0;i
有没有办法让随机变量在构造函数上方的声明区域工作

不,您必须在构造函数本身中进行调用

您的代码还存在许多其他问题,看起来有些混乱。很难提出最佳方法,因为您还没有详细列出您的需求

代码中最明显的混淆迹象之一是,每个方法都声明了一个局部变量,该变量隐藏了字段
student

Student[] student = new Student[randomLevel];

另一个混乱的迹象是,局部变量与字段的类型不同。局部变量是
Student[]
类型的数组,而隐藏字段只是一个Student:

Student student = new Student();
这是一个很好的例子,说明了为什么数组和集合使用复数名称是一个好主意。如果你用
book
而不是
books
的名称来调用库中的内容,这会让人感到困惑。这也是一个很好的例子,说明了字段具有不同的命名约定的价值,比如使用下划线前缀的常见方法(尽管有些人不同意这种做法)。这使得在您的思维中很容易将字段和局部变量分开

因为您希望教师对象有一个学生对象的集合来操作,并且希望该集合在方法调用之间保持不变,所以集合应该是
teacher
类的一个字段,正如Austin Salonen所建议的那样。(一般来说,正如奥斯汀所暗示的,出于几个原因,大多数人更喜欢通用
列表
,而不是数组。我暂时不提这个问题,因为你可能出于教学原因使用数组。)

为特定操作选择学生时,请按索引选择学生:

int index = GetIndexFromUserOrWhereverElse();
Student student = _students[index];
DoSomethingWith(student);
如果要对每个学生执行相同的操作,可以使用for循环或foreach循环:

for (int index = 0; index < students.Length; index++)
    DoSomethingTo(_students[index]);
另一个建议:为变量和方法使用描述性名称:

  • 名称
    编号
    不具有描述性
  • 不清楚为什么
    excused()
    方法返回整数
  • 不清楚向学生添加(
    add()
    一个整数意味着什么,特别是因为如果为缺席的学生添加数字,该值来自
    excused()
    方法,否则它表示用户输入的页数
有没有办法让随机变量在构造函数上方的声明区域工作

不,您必须在构造函数本身中进行调用

您的代码还存在许多其他问题,看起来有些混乱。很难提出最佳方法,因为您还没有详细列出您的需求

代码中最明显的混淆迹象之一是,每个方法都声明了一个局部变量,该变量隐藏了字段
student

Student[] student = new Student[randomLevel];

另一个混乱的迹象是,局部变量与字段的类型不同。局部变量是
Student[]
类型的数组,而隐藏字段只是一个Student:

Student student = new Student();
这是一个很好的例子,说明了为什么数组和集合使用复数名称是一个好主意。如果你用
book
而不是
books
的名称来调用库中的内容,这会让人感到困惑。这也是一个很好的例子,说明了字段具有不同的命名约定的价值,比如使用下划线前缀的常见方法(尽管有些人不同意这种做法)。这使得在您的思维中很容易将字段和局部变量分开

因为您希望教师对象具有要操作的学生对象的集合,所以