列表引用与列表对象作为类中的成员

本文关键字:列表 成员 引用 对象 | 更新日期: 2023-09-27 17:55:51

考虑我们有一个如下所示的类

public class Hotel
{
    public List<Room> lstRooms;
    public List<Room> objLstRoom = new List<Room>();
}

如果我为此 Hotel 类创建一个对象,

  • 该对象中的这两个变量之间有什么区别?
  • 由于列表最初是空的,因此其中会存储什么?

列表引用与列表对象作为类中的成员

第一个是null 。第二个不是。

如果您不为成员分配任何内容,则会为其分配默认值,因此它等于写入

public class Hotel
{
    public List<Room> lstRooms = default(List<Room>);
    public List<Room> objLstRoom = new List<Room>();
}

对于引用类型,默认值null ,因此第一个变量将变为 null

其他列表呢,它将被初始化,但正如你所说,它将保持为空。

lstRooms nullobjLstRoom是空列表。如果您访问lstRooms您将获得空引用异常。

  • List<Room> lstRoomsnull
  • List<Room> objLstRoom = new List<Room>()将是一个空列表

因此,第一个是拥有 0 间客房的酒店,第二个是没有定义房间的酒店。

null List上调用实例方法会导致崩溃:

int count = lstRooms.Count; // crash because lstRooms is null

int count = objLstRoom.Count; // => 0

那么什么更好呢?我总是喜欢一个空列表。

因为这很糟糕:

if(hotelInstance.objLstRoom != null)
{
  foreach(va room in hotelInstance.objLstRoom)
    /* .... */
}

这样更好

foreach(va room in hotelInstance.objLstRoom)
    /* .... */

lstRooms 将为空,objLstRoom将为空List<Room>,没有元素。

这意味着,例如,lstRooms.Add(new Room())将抛出一个空引用异常,objLstRoom.Add(new Room)将正常工作。

您的代码等效于:

public class Hotel
{
    public List<Room> lstRooms;
    public List<Room> objLstRoom;
    public Hotel()
    {
        objLstRoom = null;  // Default initialization in .NET
        objLstRoom = new List<Room>()
    }
}

What would be the difference between these two variables in that object?

lstRoom将是nullobjLstRoom将是empty list

Since list would be empty initially, what would have been stored in it?

lstRoomobjLstRoom都不会存储任何内容。

public class Hotel
{
    public List<Room> lstRooms; // null
    public List<Room> objLstRoom = new List<Room>(); // empty list
}

要回答您的问题:

  1. 该对象中的这两个变量之间有什么区别?

    lstRooms 将为空,objLstRoom 将为空列表。

  2. 由于列表最初是空的,因此其中会存储什么?

    它不会存储任何内容。

我一直试图把它想象成一个盒子。

所以public List<Room> lstRooms;是一个空盒子。它有足够的空间来容纳房间对象列表,但实际上并不包含列表。(还)

public List<Room> objLstRoom = new List<Room>();是一个盒子,里面已经有一个房间列表。构造函数被调用,这是一个相当大的区别。

在第一个示例中,您将创建对列表的引用。就像一个指针,但第二个示例实际上是在创建一个列表。

如果您尝试调用类似 lstRooms.Add(new Room()); 的内容,您将收到一个未分配变量错误,因为要添加到的新房间不存在该对象。其中 as objLstRoom.Add(new Room());会正常工作。