保持我的列表/字典全局可访问

时间:2013-05-23 14:25:44

标签: c# list class object dictionary

好的......我正在尝试理解这个完整的面向对象编程,但我总是陷入死胡同。 ;)

我正在尝试存储或者更确切地说将使用类存储大量数据。我想通过使用具有多个属性的类来存储行星数据,然后我将这些保存到列表中。

我的问题是我不知道如何使这个列表全局可访问,它只能在创建它的实例中访问。

以下测试环境中的一些示例代码。

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()));
}

我花了几个小时在这里和其他地方查找我的问题,但我不知道如何访问我放入列表的信息,而不是在单个实例中。我的真实应用程序将拥有成千上万的轨道实体和许多其他数据,这些数据必须可以通过多种形式,甚至其他类别访问。

一些帮助将不胜感激,什么是最好的解决方案?完全不同吗?!?

4 个答案:

答案 0 :(得分:2)

你不需要静态成员或单身人士(这两者都会导致比他们解决的更多问题),你需要Dependency Injection

在表单之外创建List,将其传递给表单构造函数。您需要使用列表,从表单传递您的实例。

这种方式只有一个列表,无论何处都需要列表传递 a 列表(恰好是相同的列表)。

如果您及时意识到您确实需要为两个不同的系统建模,那么您只需创建两个不同的列表,并将它们传递给两个不同的表单,一切都继续工作,您无需返回代码删除引用静态成员。

老实说,这是完全可行的,不会走向黑暗的一面,并使作为静态/全局变量的邪恶永久化。

NB Why static variables are considered evil

答案 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;

希望有所帮助。