尝试创建类的数组列表时出现NullReferenceException
本文关键字:NullReferenceException 列表 数组 创建 | 更新日期: 2023-09-27 18:25:57
我在SQL中有一个包含不同服务的表。每个服务都有一些特性(这意味着每一行在SQL中都有不同的列)。例如:
s1:id1,a1,b1(id:int,a:smallint,b:real)
s2:id2、a2、b2
我想在c#中列出这些服务。
由于某些原因,每列都应该有一些属性。例如:
对于a1形式s1,我们应该有以下内容:
a1.type,a1.typeal,a1.min
这就是我所做的:
public class ClsAdvertisement
{
public string type { get; set; }
public double typical { get; set; }
public double min { get; set; }
}
protected void MyFuction()
{
List<ClsAdvertisement[]> services = new List<ClsAdvertisement[]>();
SqlDataReader dr1 = cmd1.ExecuteReader();
if (dr1.HasRows)
{
while (dr1.Read())
{
ClsAdvertisement[] qualities=new ClsAdvertisement[3];
if (dr1.IsDBNull(dr1.GetOrdinal("id")) == false)
{
qualities[0].typical = double.Parse(dr1["id"].ToString());
qualities[0].type = "id";
qualities[0].min = qualities[0].typical;
}
if (dr1.IsDBNull(dr1.GetOrdinal("a")) == false)
{
qualities[1].typical = double.Parse(dr1["a"].ToString());
qualities[1].type = "a";
qualities[1].min = qualities[1].typical - 1.0;
}
if (dr1.IsDBNull(dr1.GetOrdinal("b")) == false)
{
qualities[2].typical = double.Parse(dr1["b"].ToString());
qualities[2].type = "b";
qualities[2].min = qualities[2].typical - 1.0;
}
services.Add(new ClsAdvertisement[] { qualities[0], qualities[1], qualities[2] });
}
}
if (dr1.IsClosed == false) dr1.Close();
}
这是一个好方法吗?
如果,是的,我得到错误
System.NullReferenceException:对象引用未设置为对象的实例
在线:
qualities[0].typical = double.Parse(dr1["id"].ToString());
从我的搜索中,我知道原因是没有ClsAdvertise[]可以设置典型。但是我不知道如何初始化它?
请帮帮我。非常感谢。
请注意,我已经阅读了这个链接:"什么是NullReferenceException,我该如何修复它?"。我无法从这个链接中得到答案。我想知道我的方法是否好,如果是,如何初始化它,这在链接中没有提到。
实例化对象也可以在实例化数组时完成。请注意,quality数组本身可以添加到服务列表中。第三个优化是使用DataReader。
List<ClsAdvertisement[]> services = new List<ClsAdvertisement[]>();
using (IDataReader dr1 = cmd1.ExecuteReader())
{
while (dr1.Read())
{
ClsAdvertisement[] qualities = { new ClsAdvertisement(), new ClsAdvertisement(), new ClsAdvertisement() };
if (!dr1.IsDBNull(dr1.GetOrdinal("id")))
{
qualities[0].typical = double.Parse(dr1["id"].ToString());
qualities[0].type = "id";
qualities[0].min = qualities[0].typical;
}
if (!dr1.IsDBNull(dr1.GetOrdinal("a")))
{
qualities[1].typical = double.Parse(dr1["a"].ToString());
qualities[1].type = "a";
qualities[1].min = qualities[1].typical - 1.0;
}
if (!dr1.IsDBNull(dr1.GetOrdinal("b")))
{
qualities[2].typical = double.Parse(dr1["b"].ToString());
qualities[2].type = "b";
qualities[2].min = qualities[2].typical - 1.0;
}
services.Add(qualities);
}
}
qualities[0]
为空。
第一行应该解决这个问题:
qualities[0] = new ClsAdvertisement();
qualities[0].typical = double.Parse(dr1["id"].ToString());
qualities[0].type = "id";
qualities[0].min = qualities[0].typical;
对于阵列的所有其他元素也是如此。
问题很可能是在填充其属性之前没有实例化有问题的对象。试着这样做:
if (dr1.IsDBNull(dr1.GetOrdinal("id")) == false)
{
qualities[0] = new ClsAdvertisement();
qualities[0].typical = double.Parse(dr1["id"].ToString());
qualities[0].type = "id";
qualities[0].min = qualities[0].typical;
}