在函数之间传递值 - 对象引用未设置为对象的实例

本文关键字:设置 对象 实例 对象引用 之间 函数 | 更新日期: 2023-09-27 18:35:29

我正在尝试用 c# 制作一个上大学的程序。我应该做一个窘术,并保存每个运动员的体重、身高、姓名、代码和 BMI。我不知道这个人会向程序添加多少运动员,但数组必须动态增加,我不能浪费不必要的内存。

我想出了这个:(按钮 1 显示运动员,按钮 2 添加他们。

public partial class Form1 : Form
{
int numeroDeAtletas = 1;
Atleta[] atletas;
public struct Atleta
{
    public string nomes;
    public int codigos;
    public double altura;
    public double peso;
    public double IMC;
}
public Form1()
{
    InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
    for (int i = 0; i < (numeroDeAtletas-1); i++)
    {
        MessageBox.Show("Nome : " + atletas[i].nomes + Environment.NewLine + "Código: " + atletas[i].codigos + Environment.NewLine + "Peso: " + atletas[i].peso + Environment.NewLine + "Altura: " + atletas[i].altura + Environment.NewLine + "Indíce de massa corporal: " + atletas[i].IMC, "Atleta " + (i+1), MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}
private void button2_Click(object sender, EventArgs e)
{
    Atleta[] atletas = new Atleta[numeroDeAtletas];
    atletas[numeroDeAtletas - 1].nomes = txtName.Text;
    atletas[numeroDeAtletas - 1].codigos = Convert.ToInt32(txtCode.Text);
    atletas[numeroDeAtletas - 1].peso = Convert.ToDouble(txtWeight.Text);
    atletas[numeroDeAtletas - 1].altura = Convert.ToDouble(txtHeight.Text);
        AtletasMng atletasmng = new AtletasMng (Convert.ToInt32(txtCode.Text),txtName.Text, Convert.ToDouble(txtWeight.Text), Convert.ToDouble(txtHeight.Text));
        atletas[numeroDeAtletas - 1].IMC = atletasmng.calcularIMC();
        MessageBox.Show("Atleta número " + (numeroDeAtletas) + " adicionado com sucesso!");
        numeroDeAtletas++;
        if (numeroDeAtletas >= 2)
    {
        button1.Enabled = true;
    }
}

}

但是当我单击按钮 1 时,它说"对象引用未设置为对象的实例",我认为这是因为该行:

 Atleta[] atletas = new Atleta[numeroDeAtletas];

声明未传递给 button1_Click() 函数的局部变量。那么,我如何在此功能之间传递值呢?

在函数之间传递值 - 对象引用未设置为对象的实例

每次按下按钮 2 时,您都会删除现有的竞技

Atleta[] atletas = new Atleta[numeroDeAtletas];

但是,如果numeroDeAtletas(例如)是 3,则仅评估数组的最后一条记录,其他记录为空!

为了您的目的,我建议您使用列表。

Atleta[] atletas;替换为List<Atleta> atletas= new List<Atleta>();

每次单击Button2时,您都可以这样做

atletas.Add(new Atleta{option1="test", option2="test"});

在这种情况下,您应该使用 List

在类中声明一个类型为 AtletaList,然后使用它,正如您所说,项目的数量是动态的而不是固定的:

在类中添加一个类型为 List<Atleta> 的字段:

List<Atleta> atletas = new List<Atleta>();

在按钮上,单击添加以按以下方式列出:

 Atleta atleta = new Atleta();
 atleta.nomes = txtName.Text;
 atleta.codigos = Convert.ToInt32(txtCode.Text);
 atleta .peso = Convert.ToDouble(txtWeight.Text);
 atleta.altura = Convert.ToDouble(txtHeight.Text);
 ...................
 ...................
 ...................
 atletas.Add(Atleta);