尝试创建类的数组列表时出现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,我该如何修复它?"。我无法从这个链接中得到答案。我想知道我的方法是否好,如果是,如何初始化它,这在链接中没有提到。

尝试创建类的数组列表时出现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;
   }