1

引入了泛型 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 对象的实例存储在 Screen List 中,我可以将这个对象全部拉回吗?如果是这样,循环遍历屏幕列表<>以找到 Screen1 的最佳方法是什么?我知道这似乎是一个微不足道的问题,但我正在努力确定基础知识。先感谢您。

4

4 回答 4

2

据我了解, Screen1 是 Screen 实例的临时持有者。

有点儿。它一个“持有者”,但它不是暂时的。即使您添加Screen1ScreenList,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.Screen1thisIsTheSameScreen指向同一个对象。我们只是传递它的引用

所以,如果我们做了类似的事情

    thisIsTheSameScreen.Lenght = 20;

我们会为每个人而改变,因为它是同一个对象

一旦添加到列表中,它就会在该列表中建立索引,并且不是真正的 Screen1?

不,它仍然是一样的,我们只是分享参考。

由于 Screen 对象的实例存储在 Screen List 中,我可以将这个对象全部拉回吗?

当然,就像我在上面所做的那样。

如果是这样,循环遍历屏幕列表<>以找到 Screen1 的最佳方法是什么?

您需要一种方法来识别每个屏幕,例如 ID 或名称。这样,您可以使用 Linq 或简单的foreach.

我知道这似乎是一个微不足道的问题,但我正在努力确定基础知识。先感谢您。

你是完全正确的。我们都应该了解我们正在使用的工具。

于 2013-06-04T17:25:33.453 回答
1

我建议您将类类型的存储位置(字段、参数、数组元素等)视为保存“对象 ID”。声明someScreen.Width = 123;没有改变someScreen。如果在执行该语句之前,someScreen确定了自程序启动以来创建的第 24,601 个对象,则该语句将要求对象 #24601 将其Width属性设置为 123,并保留someScreen对对象 #24601 的引用。如果说someList.Add(someScreen), 并someList识别出第 8,675,309 个对象,那么,对象#8675309 将被要求将“对象#24601”添加到自身。请注意,实际对象#24601 不会被添加到列表中——只是它的标识。

(我不知道 .NET 提供了一种方法,通过该方法可以确定在第 24,600 个和第 24,602 个对象之间创建了哪个对象,但如果创建了超过 24,602 个对象,则必须存在一个这样的对象;在那次运行期间程序,该对象永远不能是第 24,601 个对象以外的任何其他对象,任何其他对象也不能是第 24,601 个对象;如果假设某个特定对象是第 24,601 个创建的对象,那么“对象#24601”可能,在那个假设的上下文中,用于指代有问题的对象。)

于 2013-06-04T17:28:19.710 回答
0

屏幕不是临时屏幕,它是唯一的实例。当您将其添加到列表时,会生成指向屏幕 1 的指针或引用。如果您要通过实例或列表修改屏幕 1,则两个实例都将同步更改。

您应该阅读有关引用的内容,可能还有 c++ 指针,这应该有助于您理解。

于 2013-06-04T17:20:14.183 回答
-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
于 2013-06-04T17:22:42.907 回答