好的......我正在尝试理解这个完整的面向对象编程,但我总是陷入死胡同。 ;)
我正在尝试存储或者更确切地说将使用类存储大量数据。我想通过使用具有多个属性的类来存储行星数据,然后我将这些保存到列表中。
我的问题是我不知道如何使这个列表全局可访问,它只能在创建它的实例中访问。
以下测试环境中的一些示例代码。
OrbitalBodies.cs
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()));
}
我花了几个小时在这里和其他地方查找我的问题,但我不知道如何访问我放入列表的信息,而不是在单个实例中。我的真实应用程序将拥有成千上万的轨道实体和许多其他数据,这些数据必须可以通过多种形式,甚至其他类别访问。
一些帮助将不胜感激,什么是最好的解决方案?完全不同吗?!?
答案 0 :(得分:2)
你不需要静态成员或单身人士(这两者都会导致比他们解决的更多问题),你需要Dependency Injection。
在表单之外创建List,将其传递给表单构造函数。您需要使用列表,从表单传递您的实例。
这种方式只有一个列表,无论何处都需要列表传递 a 列表(恰好是相同的列表)。
如果您及时意识到您确实需要为两个不同的系统建模,那么您只需创建两个不同的列表,并将它们传递给两个不同的表单,一切都继续工作,您无需返回代码删除引用静态成员。
老实说,这是完全可行的,不会走向黑暗的一面,并使作为静态/全局变量的邪恶永久化。
答案 1 :(得分:1)
使用设计模式Singleton。
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;
}
}
然后在您的代码中的任何地方,当您需要orbitalList
调用
Globals.GetOrbitalBodies().<do whatever with your list>
尽量不要使用静态类,因为它们在OO设计方面很糟糕。
答案 2 :(得分:0)
将OrbitalList
设为属性:
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]);
答案 3 :(得分:0)
如果您只想在“Form1”类中访问您的列表,只需将其声明为函数中的私有成员:
private List<OrbitalBodies> _orbitalList;
然后将其实例化为“button1_Click”方法。
如果您想在所有课程中访问您的列表,我建议您将其设为静态:
public class NewClass
{
public static List<OrbitalBodies> OrbitalList {get; set;};
}
你可以这样称呼它
NewClass.OrbitalList;
希望有所帮助。