【问题标题】:Add values to list in class c# [duplicate]将值添加到类 c# 中的列表 [重复]
【发布时间】:2021-06-21 15:06:46
【问题描述】:

我有这样的课程:

public class myDataType
{
   public class GetInvoice
   {
      public string InvoiceID { get; set; }
      public string InvoiceNumber { get; set; }
      public decimal InvoiceAmount { get; set; }
      public List<InvoiceRow> Rows { get; set; } 
   }

   public class InvoiceRow
   {
      public decimal RowQty { get; set; }
      public string RowCode { get; set; }
      public string RowDescription { get; set; }
   }
}

而当我要添加数据的时候

using static test.myDataType;
...
private void LoadData()
{
   GetInvoice Invoice = new GetInvoice();
   
   Invoice.InvoiceID = "0a8625e5-62f6-4ad7-a8bf-ab04b1158392";
   Invoice.InvoiceNumber = "Inv-001";
   Invoice.InvoiceAmount = 100;
   
   Invoice.Rows.Add(new InvoiceRow { RowQty= 1, RowCode = "C100", RowDescription = "Item C100"});

}

当尝试添加行时:

Invoice.Rows.Add(new InvoiceRow { RowQty= 1, RowCode = "C100", RowDescription = "项目 C100"});

显示这个错误“System.NullReferenceException: 'Object reference not set to an instance of an object'”

我想我有一个错误的方法来做这件事 有人可以帮忙吗?

提前致谢

【问题讨论】:

  • Invoice.Rows 为空。在尝试添加任何新元素之前,请确保为它分配了一个 List&lt;InvoiceRow&gt; 实例,例如与public List&lt;InvoiceRow&gt; Rows { get; set; } = new List&lt;InvoiceRow&gt;()。我会将您的问题链接到另一个关于调试 NullReferenceExceptions 的好建议
  • 除此之外,您可能希望Rows 属性具有private set。这仍然允许从类外更改列表,但会阻止类外的代码替换或删除您下面的列表。

标签: c# list class


【解决方案1】:

这不是语法错误,只是您没有初始化列表。

public List<InvoiceRow> Rows { get; private set; } 

您已经声明了存放列表的位置,但尚未创建列表本身。

(如果打个比方有帮助的话,想象一下你已经在房子的墙上画了一条线,你要在哪里放一个书架,但你实际上还没有把书架拧到墙上——情况就是这样你的代码在)。

如果您希望列表始终可用,您可以通过属性声明或在类的构造函数中自动初始化它。当然,您也可以让调用代码对其进行初始化。

这个版本只是让它成为属性声明的一部分:

public List<InvoiceRow> Rows { get; private set; } = new List<InvoiceRow>(); 

【讨论】:

  • 可爱的比喻!投赞成票
  • @MongZhu 为什么谢谢! (我通常通过比较将项目添加到列表中的行为与将书籍放在书架上的行为来扩展这个类比 - 有时我看到一些问题,人们认为实例化列表也会以某种方式填充它。)
  • 其实是因为添加书籍的部分。我自己推断了这一点。所以我觉得这是一个很好的类比
  • 感谢它的作品很棒¡
【解决方案2】:

在添加元素之前,您需要先初始化列表 Rows。 例如在 GetInvoice 类中,您可以添加:

public List<InvoiceRow> Rows { get; set; } = new List<InvoiceRow>();

List是C#中的引用类型,使用前需要初始化。

如果你想在 LoadData() 方法中这样做,你可以这样做:

private void LoadData()
    {
        GetInvoice Invoice = new GetInvoice();

        Invoice.InvoiceID = "0a8625e5-62f6-4ad7-a8bf-ab04b1158392";
        Invoice.InvoiceNumber = "Inv-001";
        Invoice.InvoiceAmount = 100;

        Invoice.Rows = new List<InvoiceRow>();
        Invoice.Rows.Add(new InvoiceRow { RowQty = 1, RowCode = "C100", RowDescription = "Item C100" });

    }

【讨论】:

  • 一个例子和一个解释将使答案更有用
  • 编辑答案,如果您要提供一些东西,请不要将其转储到 cmets。
  • 我编辑了它,虽然我看到你已经提供了答案。
  • 是的,我只是想帮助你,让你提高你的水平:-)
  • 感谢您的建议 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 2018-05-27
  • 2013-01-04
  • 1970-01-01
  • 2015-06-03
  • 2021-12-01
  • 1970-01-01
相关资源
最近更新 更多