【问题标题】:Declare list field and the constructor in a user defined class in C#在 C# 中的用户定义类中声明列表字段和构造函数
【发布时间】:2020-07-27 18:28:09
【问题描述】:

所以我正在使用“Murach's C# 2015”教科书学习 C#。在第 13 章第 411 页,有一个这样的代码:

public class ProductList
{
    private List<Product> products;

    public ProductList()
    {
        products = new List<Product>();
    }

所以第一行“public class ProductList”声明了一个类

第二行“私有列表产品”;声明一个类变量(即:“字段”)......在这种情况下是一个列表......我不明白这个?到目前为止,我所学到的只是一个列表是这样初始化的:

private List<Product> products = new List<Product>();

谁能给我解释一下?这就是列表的一贯做法吗?或者这是短手?还有其他方法吗?

我理解下一段代码是构造函数,即:

    public ProductList()
    {
        products = new List<Product>();
    }

我在这里看到了我习惯于在列表中看到的“新”关键字。

【问题讨论】:

  • 您的示例(声明和初始化列表)实际上与声明成员然后在构造函数中初始化它的广告相同。构造函数之外的所有初始化代码都聚集在一起并在任何构造函数运行之前运行(一个类可能有许多构造函数,一个实例由其中一个构造)。简而言之,别担心——你的想法是对的
  • 声明一个对象变量和为该变量创建一个实例是两件不同的事情。一个通知编译器,另一个准备使用。为了方便,我们经常将它们混为一谈,但它们是不同的操作。您的第一个代码块只需分两步完成。

标签: c# list class constructor field


【解决方案1】:
private List<Product> products;

这声明了该字段。 IE。告诉编译器该类包含该类型的字段。除非进行更多操作,否则将为该类型分配默认值(即在本例中为 null)。

private List<Product> products = new List<Product>();

这是一个组合的声明和初始化。它与上述相同,但也为该字段分配了一个新构造的对象。在您的情况下,这些示例是等效的。但是考虑

public ProductList(int capacity)
{
    products = new List<Product>(capacity);
}

这里我们必须分开声明和初始化,因为我们需要一些参数来初始化。

【讨论】:

  • 谢谢!!所以最近,我在看“Murach's C# 2015”教科书(第 12 章)的第 387 页。它有“private List products = null;”......所以你说这与“private List products;”相同基本上......只是简略......我用谷歌搜索了这个“=null”,发现它非常有争议......很多人认为你不应该将它设置为=null,而是使用“私人列表产品” = 新列表();"制作一个空列表而不是一个空列表。
  • 是的。将其初始化为 null 是多余的,因为它是默认行为,但可以这样做以表明它是有意完成的。但我同意应尽可能避免使用空值。构造函数完成后,对象应该完全可用,这应该包括分配所有字段。
猜你喜欢
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
相关资源
最近更新 更多