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
。如果,在该状态之前