首页 > 解决方案 > C# 分配一个类数组,但值被视为 0

问题描述

我目前被困在一个项目上。我必须实例化一个类 x 次。每次运行程序时 x 的值都可能不同。这是我的澄清代码。

 public partial class Form1 : Form
{
    private static int Rooms;              
    private Room[] room = new Room[Rooms]; 

    public Form1()
    {
        InitializeComponent();
        Start();
    }

    private void Start()
    {
        string[] lines = File.ReadAllLines(@"C:Path\Test.txt");
        Rooms = lines.Length;
        for (int i = 0; i < room.Length; i++)
        {
            if (i == 13)
            {
                continue;
            }
            else
            {
                this.room[i] = new Room(i);
            }
            listBox1.Items.Add(this.room[i].RoomNumber.ToString());
        }
    }
}

调试时,将鼠标悬停RoomsPrivate static int Rooms;显示正确的值;将鼠标悬停在Roomsprivate Room[] room = new Room[Rooms];也会显示正确的值,但将其视为 0。它不会将房间号添加到列表框中。如果我使用Rooms + 1,它只会添加 1 个房间号。虽然如果我Rooms用正确的 x 值替换,它确实有效。

这里有谁知道会发生什么以及如何解决这个问题?

标签: c#

解决方案


您的静态变量在调用构造函数之前初始化(特别是,一旦代码引用了类,它们就会被初始化)。默认情况下,int变量被初始化为零,这就是数组最初有零元素的原因,但在调试器中显示为正确的值。Rooms分配变量后,您需要移动数组初始化:

public partial class Form1 : Form
{
    private static int Rooms;              
    private Room[] room;

    public Form1()
    {
        InitializeComponent();
        Start();
    }

    private void Start()
    {
        string[] lines = File.ReadAllLines(@"C:Path\Test.txt");
        Rooms = lines.Length;
        room = new Room[Rooms]; 
        for (int i = 0; i < room.Length; i++)
        {
            if (i == 13)
            {
                continue;
            }
            else
            {
                this.room[i] = new Room(i);
            }
            listBox1.Items.Add(this.room[i].RoomNumber.ToString());
        }
    }
}

推荐阅读