3

好的...我试图理解整个面向对象的编程,但我一直陷入死胡同。;)

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

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

下面是我的测试环境中的一些示例代码。

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

来自1.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

4 回答 4

3

您不想要静态成员或单例(两者都会导致比解决的问题更多的问题),您需要Dependency Injection

在表单之外创建列表,将其传递给表单构造函数。在您需要使用列表的任何地方,传递您从表单中获得的实例。

这样只有一个列表,需要列表的任何地方都会传递一个列表(恰好是同一个列表)。

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

老实说,这是完全可行的,而无需进入阴暗面并延续静态/全局变量的邪恶。

注意为什么静态变量被认为是邪恶的

于 2013-05-23T14:41:40.293 回答
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 设计方面是一团糟。

于 2013-05-23T14:35:12.577 回答
0

如果您只想访问“Form1”类中的列表,只需将其声明为函数外的私有成员:

private List<OrbitalBodies> _orbitalList;

然后将其实例化到您的“button1_Click”方法中。

如果您想在所有课程中访问您的列表,我建议您将其设为静态:

public class NewClass
{

   public static List<OrbitalBodies> OrbitalList {get; set;};

}

你这样称呼它

NewClass.OrbitalList;

希望有帮助。

于 2013-05-23T14:32:50.560 回答
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]);
于 2013-05-23T14:30:15.093 回答