C# 使我的列表/词典保持全局可访问
好的。。。我试图理解整个面向对象的编程,但我总是走到死胡同 我正在尝试存储,或者更确切地说,将使用我应该使用的类来存储大量数据。我想使用一个具有多个属性的类来存储行星数据,然后将这些属性保存到列表中 我的问题是,我不知道如何使这个列表全局可访问,它只能在创建它的实例中访问 下面是我的测试环境中的一些示例代码 轨道体C# 使我的列表/词典保持全局可访问,c#,list,class,object,dictionary,C#,List,Class,Object,Dictionary,好的。。。我试图理解整个面向对象的编程,但我总是走到死胡同 我正在尝试存储,或者更确切地说,将使用我应该使用的类来存储大量数据。我想使用一个具有多个属性的类来存储行星数据,然后将这些属性保存到列表中 我的问题是,我不知道如何使这个列表全局可访问,它只能在创建它的实例中访问 下面是我的测试环境中的一些示例代码 轨道体 class OrbitalBodies { public int BodyID { get; set; } public string BodyName { get;
class OrbitalBodies
{
public int BodyID { get; set; }
public string BodyName { get; set; }
public int BodySize { get; set; }
public int BodyX { get; set; }
public int BodyY { get; set; }
}
From1.cs
public void button1_Click(object sender, EventArgs e)
{
var bodies0 = new OrbitalBodies();
var orbitalList = new List<OrbitalBodies>();
bodies0.BodyID = 4;
bodies0.BodyName = "Earth";
bodies0.BodySize = 125;
bodies0.BodyX = -450;
bodies0.BodyY = 75;
orbitalList.Add(bodies0);
bodies0.BodyID = 0;
bodies0.BodyName = "Sol";
bodies0.BodySize = 500;
bodies0.BodyX = 0;
bodies0.BodyY = 0;
orbitalList.Add(bodies0);
//var orbitalDic = new Dictionary<int, OrbitalBodies>();
MessageBox.Show("Planetary body name: " + Convert.ToString(orbitalList.Count()));
}
public void按钮1\u单击(对象发送者,事件参数e)
{
var bodies0=新的轨道体();
var orbitalList=新列表();
身体0.BodyID=4;
bodies0.BodyName=“地球”;
车身0.5毫米,车身尺寸=125毫米;
车身0.BodyX=-450;
车身0.BodyY=75;
添加(bodies0);
bodies0.BodyID=0;
bodies0.BodyName=“Sol”;
车身尺寸0.5毫米=500毫米;
bodies0.BodyX=0;
bodies0.BodyY=0;
添加(bodies0);
//var orbitalDic=新字典();
MessageBox.Show(“行星体名称:”+Convert.ToString(orbitalList.Count());
}
我已经花了几个小时在这里和其他地方查找我的问题,但我不知道如何访问我在列表中输入的信息,除了在单个实例中。我真正的应用程序将有成千上万个轨道体和许多其他数据,这些数据必须可以通过多种形式甚至其他类别访问
如果您能提供一些帮助,我们将不胜感激。最好的解决方案是什么?完全不同吗 将
轨道列表
作为一个属性:
public List<OrbitalBodies> OrbitalList {get;set;}
public void button1_Click(object sender, EventArgs e)
{
var bodies0 = new OrbitalBodies();
bodies0.BodyID = 4;
bodies0.BodyName = "Earth";
bodies0.BodySize = 125;
bodies0.BodyX = -450;
bodies0.BodyY = 75;
OrbitalList.Add(bodies0);
//...
}
//Then you can do:
doSomething(myForm.OrbitalList[0]);
公共列表轨道列表{get;set;}
公共无效按钮1\u单击(对象发送者,事件参数e)
{
var bodies0=新的轨道体();
身体0.BodyID=4;
bodies0.BodyName=“地球”;
车身0.5毫米,车身尺寸=125毫米;
车身0.BodyX=-450;
车身0.BodyY=75;
添加(bodies0);
//...
}
//然后你可以做:
剂量测定法(myForm.OrbitalList[0]);
如果您只想访问“Form1”类中的列表,只需将其声明为函数外的私有成员即可:
private List<OrbitalBodies> _orbitalList;
希望有帮助。使用设计模式
尽量不要使用静态类,因为它们在OO设计方面是混乱的。您不需要静态成员或单例(这两种类型都会导致比它们解决的问题更多),您需要 在表单外部创建列表,并将其传递给表单构造函数。在需要使用列表的任何地方,传递表单中的实例 这样,只有一个列表,需要该列表的所有地方都会传递一个列表(恰好是同一个列表) 如果最终您意识到您实际上需要对两个不同的系统建模,您只需创建两个不同的列表,并将它们传递到两个不同的表单,一切都会继续工作,您不需要通过代码删除对静态成员的引用 老实说,这是完全可以做到的,不必走到黑暗面,也不必让静态/全局变量的邪恶永久化
注意从应用程序设计的角度来看,您可能不希望它是全局的。虽然一开始尝试确定什么是合适的范围并确保其范围在该级别似乎比较容易,但这种编程方法将整个应用程序变成一堆意大利面代码,随着时间的推移,这些代码变得很难使用、理解和维护。还请注意,如果您在全球公开此信息,则需要处理线程安全问题;这可能是一种真正的痛苦。@Servy,这并不完全正确。很多东西,主要是在游戏开发中,使用静态数据来存储游戏(世界)或其他东西,这些东西在运行过程中不会改变,或者需要随时随地都可以访问。@MartinPerry我不是说你不应该让任何东西在全球范围内都可以访问,我只是说,在这种情况下,考虑到他所做的事情,这似乎并不合适,而且在合适的情况下也很少见。马丁·佩里:没有理由把它当作一个全局变量。依赖注入是前进的方向,伙计。这是一种游戏的开始。一个可以处理大量数据的游戏。不是常见的主流射击类…;)我需要相当多的数据才能随时访问,从数据库中读取数据只能在保存和加载期间进行。或多或少…不,好吧,我今天学到了一些东西。但你不必否决我的答案,因为我正试图帮助你。对不起,巴德,我没有否决你的答案。我不会对一个我也提供了答案的问题的答案投反对票。遗憾的是,这些信息必须通过多种形式获得:(@orel我发现binary反对静态变量的运动很奇怪。谢谢orel,这很有帮助。看看静态变量是如何完成一个目标的,我觉得使用它们没有错。如果做某件事没有问题,那么这样做就没有错。愚蠢的程序员。我永远不会理解他们的语法参数。不,比静态类更好对于很多事情来说,它们都是很好的解决方案。虽然不是在这种情况下,但对于初学者来说,如果他想“快”要看到一些结果,它们就足够了。@MartinPerry它实际上与静态类没有任何区别,至少目前是这样。唯一真正的区别是单例可以实现接口并利用多态性,但你没有做到这一点,所以它并不是真的更好。@MartinPerry,为什么有一个sta很重要tic对对象的引用是对列表的引用,而不仅仅是对列表的静态引用?有什么区别(在此上下文中)是吗?@MartinPerry我相信你有。你可能没有这么说,但你有。是的,这就像说你不需要锤子把钉子钉进木头里,你可以用玻璃瓶代替…如果你管理得当。c
public class NewClass
{
public static List<OrbitalBodies> OrbitalList {get; set;};
}
NewClass.OrbitalList;
public class Globals
{
private List<OrbitalBodies>() orbiralList;
private static Globals instance;
private Globals()
{
this.orbiralList = new List<OrbitalBodies>();
this.instance = NULL;
}
public static List<OrbitalBodies>() GetOrbitalBodies()
{
if (instance == null) instance = new Globals();
return instance.orbitaList;
}
}
Globals.GetOrbitalBodies().<do whatever with your list>