理解对象列表

时间:2013-06-04 17:12:59

标签: c# list

引入了通用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?我知道这似乎是一个微不足道的问题,但我正试图确定基础知识。先感谢您。

4 个答案:

答案 0 :(得分:2)

  

根据我的理解,Screen1是Screen的临时持有者   实例

有点儿。它的“持有者”,但它不是暂时的。即使您将Screen1添加到ScreenListScreen1仍然有效。您刚刚将引用复制到该对象。想象一下:

    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.Screen1thisIsTheSameScreen指向同一个对象。我们只是传递参考

所以,如果我们做了像

这样的事情
    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