我试图提前得到一些帮助,但我不认为我提供了足够的信息,尽管我很感谢所有的建议。
目标只是将对象室的新实例添加到数组并打印到列表框。当用户尝试输入已存在的房间名称时,应该只显示已存在于阵列中的房间的规格。
我一直得到一个空引用异常。
这是我的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Room_Class
{
public partial class Form1 : Form
{
Room[] roomArray = new Room[20];
int count = 0;
public Form1()
{
InitializeComponent();
}
private void btnAddRm_Click(object sender, EventArgs e)
{
double length, width, height;
if (VerifyRoomName() == true)
{
if (txtRmLen.Text == "" || txtRmWid.Text == "" || txtRmHt.Text == "")
{
for (int i = 0; i < roomArray.Length; i++)
{
if (txtRmName.Text == roomArray[i].getRoomName())
{
txtRmName.Text = roomArray[i].getRoomName();
txtRmLen.Text = roomArray[i].getLength().ToString();
txtRmHt.Text = roomArray[i].getCeilingHeight().ToString();
txtRmWid.Text = roomArray[i].getWidth().ToString();
}
else
{
roomArray[count] = new Room(roomName);
count++;
}
}
}
else
{
try
{
length = double.Parse(txtRmLen.Text);
width = double.Parse(txtRmWid.Text);
height = double.Parse(txtRmHt.Text);
for (int i = 0; i < roomArray.Length; i++)
{
if (txtRmName.Text == roomArray[i].getRoomName())
{
txtRmName.Text = roomArray[i].getRoomName();
txtRmLen.Text = roomArray[i].getLength().ToString();
txtRmHt.Text = roomArray[i].getCeilingHeight().ToString();
txtRmWid.Text = roomArray[i].getWidth().ToString();
}
else
{
roomArray[count] = new Room(roomName, length, width, height);
count++;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "\n\nPlease Enter Valid Values", "Error!");
}
}
PrintList();
}
}
private void PrintList()
{
double paintTotal = 0, feetTotal = 0;
string RoomName;
lstRoomList.Items.Clear();
for (int i = 0; i < count; i++)
{
RoomName = roomArray[i].getRoomName() + "\t" + roomArray[i].SquareFeet().ToString("n1") + "\t" + roomArray[i].GallonsPaint().ToString("n1");
lstRoomList.Items.Add(RoomName);
paintTotal += roomArray[i].GallonsPaint();
feetTotal += roomArray[i].SquareFeet();
lblTtlGallons.Text = paintTotal.ToString("n1");
lblTtlSqFt.Text = feetTotal.ToString("n1");
}
}
private bool VerifyRoomName()
{
if (roomName == "")
{
MessageBox.Show("Please Enter a Room Name", "Error!");
return false;
}
else
return true;
}
}
}
你的代码应该是
if (roomArray[i] != null)
无论何时创建数组,您都必须先初始化它的各个项目,然后才能访问它们。
Room[] roomArray = new Room[20];
roomArray[0] = new Room();
因为Room []内的Room元素我们没有初始化。
尝试
public Form1()
{
InitializeComponent();
for(int i = 0; i < roomyArray.Length; i++) roomArray[i] = new Room();
}
正如其他答案所说,您需要在开始使用之前初始化阵列。当你写:
Room[] roomArray = new Room[20];
你告诉计算机要做的是保留足够的内存来引用Room
类型的20个对象。提出的其他解决方案很好,但如果您想要性能,请尝试以下方法:
根据this的回答,使用以下函数将比迄今为止提供的其他解决方案更高效。这也有来自this blog post.的支持证据
注意:我已经转换为使用泛型
/// <summary>
/// Fills an array with a default value
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="array">The array to fill with a default value</param>
/// <param name="value">The default value</param>
public static void MemSet<T>(T[] array, T value)
{
if (array == null)
{
throw new ArgumentNullException("array");
}
int block = 32, index = 0;
int length = Math.Min(block, array.Length);
//Fill the initial array
while (index < length)
{
array[index++] = value;
}
length = array.Length;
while (index < length)
{
Buffer.BlockCopy(array, 0, array, index, Math.Min(block, length - index));
index += block;
block *= 2;
}
}
用法
Memset<Room>(roomArray, new Room());