引入了通用List<>的概念。请考虑以下
// Create an instance of the Theater class.
this.MarcusTheater = new Theater();
// Set the field values of the Theater.
this.MarcusTheater.Screens = new List<Screen>();
this.MarcusTheater.Screen1 = new Screen();
// Set the field values for Screen1.
this.MarcusTheater.Screen1.Lenght = 23;
this.MarcusTheater.Screen1.Width = 50;
// Add Screen1 to the Screen list.
this.MarcusTheater.Screens.Add(this.MarcusTheater.Screen1);
根据我的理解,Screen1是Screen实例的临时持有者。一旦添加到列表中,它就会在该列表中编入索引并且不是真正的Screen1?由于Screen对象的实例存储在屏幕列表中,我可以完全撤回此对象吗?如果是这样,循环列表的最佳方式是什么&lt;&gt;筛选以找到Screen1?我知道这似乎是一个微不足道的问题,但我正试图确定基础知识。先感谢您。
答案 0 :(得分:2)
根据我的理解,Screen1是Screen的临时持有者 实例
有点儿。它的是“持有者”,但它不是暂时的。即使您将Screen1
添加到ScreenList
,Screen1
仍然有效。您刚刚将引用复制到该对象。想象一下:
this.MarcusTheater = new Theater();
this.MarcusTheater.Screens = new List<Screen>();
this.MarcusTheater.Screen1 = new Screen();
// <your stuff here>
this.MarcusTheater.Screens.Add(this.MarcusTheater.Screen1);
Screen1 thisIsTheSameScreen = this.MarcusTheater.Screens[0];
此时,this.MarcusTheater.Screen1
和thisIsTheSameScreen
指向同一个对象。我们只是传递参考。
所以,如果我们做了像
这样的事情 thisIsTheSameScreen.Lenght = 20;
我们会为每个人改变,因为它是同一个对象。
一旦添加到列表中,它就会在该列表中编入索引,而不是 真的是Screen1?
没有。它仍然是相同的,我们只是分享参考。
由于Screen对象的实例存储在 屏幕列表,我可以完全撤回这个对象吗?
当然,就像我上面那样。
如果是这样,循环列表的最佳方式是什么&lt;&gt;的屏幕 为了找到Screen1?
您需要一种识别每个屏幕的方法,例如ID或名称。通过这种方式,您可以使用Linq或简单的foreach
来迭代该列表并获取您要查找的列表。
我知道这可能看起来像一个微不足道的问题,但我正试图指出 基础知识。提前谢谢。
你是完全正确的。我们都应该了解我们正在使用的工具。
答案 1 :(得分:1)
我建议您将类型存储位置(字段,参数,数组元素等)视为保存“对象ID”。声明someScreen.Width = 123;
不会更改someScreen
。如果在执行该语句之前,someScreen
标识了自程序启动以来创建的第24,601个对象,则该语句将要求对象#24601将其Width
属性设置为123,并保留{{1}参考对象#24601。如果有人说someScreen
,而someList.Add(someScreen)
标识了第8,675,309个对象,则会要求对象#8675309将“对象#24601”添加到自身。请注意,实际对象#24601不会添加到列表中 - 仅仅是其标识。
(我不知道.NET提供了一种方法,通过它可以确定在第24,600和24,602个对象之间创建了哪个对象,但是如果创建了超过24,602个对象,则必须存在一个这样的对象;在该程序的运行中,该对象永远不会是24,601对象以外的任何对象,也不能是任何其他对象都是24,601;如果假设某个特定对象是创建的第24,601个对象,那么“对象#24601 “在这个假设的背景下,可以用来指代有问题的对象。”
答案 2 :(得分:0)
屏幕不是临时屏幕,它是唯一的实例。将其添加到列表时,会生成指向屏幕1的指针或引用。如果您要通过实例或列表修改屏幕1,则两个实例都将在步骤中更改。
您应该阅读有关引用和可能的c ++指针的内容,这应该有助于您理解。
答案 3 :(得分:-2)
是的,对象是引用类型,因此两个变量都将指向内存中的同一个对象,有一种简单的方法可以测试它。您可以使用Object.ReferencesEquals
方法确定它们是否引用相同的对象。
Screen screen1 = new Screen();
screen1.Length = 23;
screen1.Width = 50;
Screen screen2 = new Screen();
screen2.Length = 23;
screen2.Width = 50;
List<Screen> screens = new List<Screen>();
screens.Add(screen1);
screens.Add(screen2);
Debug.WriteLine(Object.ReferenceEquals(screen1, screens[0])); // outputs true
Debug.WriteLine(Object.ReferenceEquals(screen2, screens[1])); // outputs true
Debug.WriteLine(Object.ReferenceEquals(screen1, screen2)); // outputs false