Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 理解对象列表_C#_List - Fatal编程技术网

C# 理解对象列表

C# 理解对象列表,c#,list,C#,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.MarcusTheate

介绍了通用列表的概念。考虑下面的

        // 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);
//创建剧院类的实例。
this.marcusthewer=新剧院();
//设置剧院的字段值。
this.marcusthewer.Screens=新列表();
this.marcusthewer.Screen1=新屏幕();
//设置Screen1的字段值。
this.marcusthewer.Screen1.Lenght=23;
this.marcusthewer.Screen1.Width=50;
//将Screen1添加到屏幕列表中。
this.marcusthewer.Screens.Add(this.marcusthewer.Screen1);

据我所知,Screen1是Screen实例的临时持有者。一旦添加到列表中,它就会在该列表中建立索引,并且不是真正的Screen1吗?由于Screen对象的实例存储在Screen列表中,我可以完整地收回这个对象吗?如果是这样的话,为了找到Screen1,循环浏览屏幕列表的最佳方式是什么?我知道这似乎是一个微不足道的问题,但我正在努力确定基本问题。先谢谢你

屏幕不是临时屏幕,它是唯一的实例。当您将其添加到列表中时,屏幕1的指针或引用被创建。如果要通过实例或列表修改屏幕1,则两个实例都将在步骤中更改


你应该阅读参考文献,可能有C++指针,这可以帮助你理解。

屏幕不是临时屏幕,它是唯一的实例。当您将其添加到列表中时,屏幕1的指针或引用被创建。如果要通过实例或列表修改屏幕1,则两个实例都将在步骤中更改


你应该阅读有关引用,以及可能的C++指针,这可以帮助你理解。

是的,对象是引用类型,因此两个变量都指向内存中的同一个对象,有一个简单易行的方法来测试这个对象。您可以使用

Object.referenceequals
方法确定它们是否引用同一对象

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
Screen screen1=新屏幕();
屏幕1.长度=23;
屏幕1.宽度=50;
屏幕屏幕2=新屏幕();
屏幕2.长度=23;
屏幕2.宽度=50;
列表屏幕=新列表();
屏幕。添加(屏幕1);
屏幕。添加(屏幕2);
Debug.WriteLine(Object.ReferenceEquals(屏幕1,屏幕[0]);//输出为真
Debug.WriteLine(Object.ReferenceEquals(屏幕2,屏幕[1]);//输出为真
Debug.WriteLine(Object.ReferenceEquals(screen1,screen2));//输出错误

是的,对象是引用类型,因此两个变量都指向内存中的同一个对象,有一种非常简单的方法来测试这一点。您可以使用
Object.referenceequals
方法确定它们是否引用同一对象

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
Screen screen1=新屏幕();
屏幕1.长度=23;
屏幕1.宽度=50;
屏幕屏幕2=新屏幕();
屏幕2.长度=23;
屏幕2.宽度=50;
列表屏幕=新列表();
屏幕。添加(屏幕1);
屏幕。添加(屏幕2);
Debug.WriteLine(Object.ReferenceEquals(屏幕1,屏幕[0]);//输出为真
Debug.WriteLine(Object.ReferenceEquals(屏幕2,屏幕[1]);//输出为真
Debug.WriteLine(Object.ReferenceEquals(screen1,screen2));//输出错误
据我所知,屏幕1是屏幕的临时支架 例如

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

    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];
我们会为每个人改变,因为这是同一个对象

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
一旦添加到列表中,它将在该列表中建立索引,而不是 真的吗

不,还是一样,我们只是分享参考资料

因为Screen对象的实例存储在 屏幕列表,我可以全部收回这个对象吗

当然,就像我在上面做的一样

如果是这样的话,在一个屏幕列表中循环的最佳方式是什么 要查找屏幕1吗

您需要一种识别每个屏幕的方法,如ID或名称。通过这种方式,您可以使用Linq或简单的
foreach
迭代该列表并获取您要查找的列表

我知道这似乎是一个微不足道的问题,但我正在努力解决 从根本上讲。先谢谢你

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

据我所知,屏幕1是屏幕的临时支架 例如

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

    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];
我们会为每个人改变,因为这是同一个对象

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
一旦添加到列表中,它将在该列表中建立索引,而不是 真的吗

不,还是一样,我们只是分享参考资料

因为Screen对象的实例存储在 屏幕列表,我可以全部收回这个对象吗

当然,就像我在上面做的一样

如果是这样的话,在一个屏幕列表中循环的最佳方式是什么 要查找屏幕1吗

您需要一种识别每个屏幕的方法,如ID或名称。通过这种方式,您可以使用Linq或简单的
foreach
迭代该列表并获取您要查找的列表

我知道这似乎是一个微不足道的问题,但我正在努力解决 从根本上讲。先谢谢你


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

我建议您将类类型存储位置(字段、参数、数组元素等)视为保存“对象ID”。语句
someScreen.Width=123不会更改
someScreen
。如果,在该状态之前