list <t>和List <t>之间的差异= c#中的新列表<t>

时间:2016-06-01 20:06:00

标签: c#

如果我的问题很愚蠢,我很抱歉,我是c#

的新手

我想知道我们创建像这样的List变量

之间的确切区别
List<T> lstStudents;

当我们创建像这样的列表时

List<T>= new List<T>();

我刚刚发现即使我们创建一个变量而没有初始化一个对象,我们仍然能够添加新对象,如果是这样的话那么这两者之间有什么区别 让我用一些我正在尝试的代码来解释这个场景

 List<Product> product = new List<Product> { 
                                        new Product() { ProductID = 1, ProductName = "A" }
                                        ,  new Product() { ProductID = 2, ProductName = "B" }
                                        ,  new Product() { ProductID = 3, ProductName = "C" }
                                        ,  new Product() { ProductID = 4, ProductName = "D" }
                                        ,  new Product() { ProductID = 5, ProductName = "E" }
                                    };

现在如果我添加这样的变量

 List<Product> p = product;

我仍然可以在此变量中添加对象

  p.Add(new Product { ProductID = 3 });

请澄清我的疑问。

谢谢

对不起,我可能在这段代码中做错了什么

 public class Students
    {
        public string Name { get; set; }
        public int StudentId { get; set; }      
    }

  List<Product> product = new List<Product> { 
                                        new Product() { ProductID = 1, ProductName = "A" }
                                        ,  new Product() { ProductID = 2, ProductName = "B" }
                                        ,  new Product() { ProductID = 3, ProductName = "C" }
                                        ,  new Product() { ProductID = 4, ProductName = "D" }
                                        ,  new Product() { ProductID = 5, ProductName = "E" }
                                    };


            List<Product> p = product;
            p.Add(new Product { ProductID = 3 });

当我运行时,我得到6件而不是5件

3 个答案:

答案 0 :(得分:3)

  

现在如果我添加这样的变量

List<Product> p = product;
     

我仍然可以在此变量中添加对象

是的,因为变量引用了相同的列表。如果您查看p,您会注意到添加的项目也会反映在那里。

  

我刚刚发现,即使我们在没有初始化对象的情况下创建变量,我们仍然可以添加新对象

不正确 - 如果你这样做:

List<T> lstStudents;

并尝试添加内容:

lstStudents.Add(...);

如果列表声明在方法中,则会出现编译器错误;如果是NullReferenceException,则lstStudents因为product没有引用任何内容(它是“空”引用)。

  

当我运行时,我得到6件而不是5件

是的,因为p引用的列表包含5个元素,Sub insertTableColumn() Dim lst As ListObject Dim currentSht As Worksheet Dim h As Long, hdrs As Variant hdrs = Array("AHT", "Target AHT", "Transfers", "Target Transfers") Set currentSht = ActiveWorkbook.Sheets("Sheet1") Set lst = ActiveSheet.ListObjects("Table1") With lst 'ActiveSheet.ListObjects("Table1") For h = 0 To 3 .ListColumns.Add .ListColumns(.ListColumns.Count).Name = hdrs(h) Next h End With End Sub 引用相同的列表,并且您添加了一个。

列表是引用类型,这意味着将一个变量的值“复制”到另一个变量只会将引用复制到基础对象。它类似于C等旧语言中的指针。

答案 1 :(得分:1)

List<T> lstStudents;

是null并且:

List<T> lstStudents = new List<T>();

是一个空列表。例如:

List<T> lstStudents;
lstStudents.add(new Student("Bob")); // this will throw a null exception

List<T> lstStudents = new List<T>();
lstStudents.add(new Student("Bob")); // this work just fine

另外,如上所述:

List<T>= new List<T>();

由于您没有指定变量名称,因此是错误的语法。

答案 2 :(得分:1)

所以看起来你有3种不同的“创建”列表的方式。

List<T> lstStudents;

这会创建一个列表,但它实际上并不“指向”任何内容。它是null。如果您尝试向其添加项目,您将获得空引用异常。

List<T> listStudents = new List<T>();

这会在内存中创建一个新列表。它是空的,你可以按照正常情况向它添加项目。

List<T> list1 = new List<T>() { // Add some items here};
List<T> list2 = list1;
Student newStudent = new Student();
list2.add(newStudent);
list1.Contains(newStudent); // This equals true. 

现在这就是我认为你可能会感到困惑的地方。 List是C#中的引用变量。这意味着两个不同的指针可以指向同一个列表。在上面的示例中,我们创建了第一个列表并添加了一些项目。在下一行中,我们创建了第二个列表,但是“指向”了第一个列表。然后我们将一个新学生添加到第二个列表中,并且神奇地将它显示在第一个列表中?怎么样?这是因为第一个和第二个列表实际上是相同的。它们只有两个不同的指针指向内存中的相同空间。

有关参考类型的更多阅读,请参阅官方MSDN文档:https://msdn.microsoft.com/en-us/library/490f96s2.aspx