如果我的问题很愚蠢,我很抱歉,我是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件
答案 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