将列表传递给另一个表单

时间:2017-01-27 09:46:39

标签: c# oop object static

我有一个有几个lists的课程。此类的名称为Trans。 我希望在其他形式中使用此列表,但我无法将其称为lists。 当我从Trans类创建一个对象时,它的列表将重置。 如何在项目的所有形式中使用此列表?

class Trans
{
    public static List<string> name_list = new List<string>();
    public static List<string> family_list = new List<string>();
    public static List<string> phoneno_list = new List<string>();

    public  List<string> name_Sec_list { set { name_list = value; } get { return name_list; } }
    public  List<string> family_Sec_list { set { name_list = value; } get { return name_list; } }
    public  List<string> phoneno_Sec_list { set { name_list = value; } get { return name_list; } }
}

Form1

Trans data = new Trans();
data.name_Sec_list.Add(name.Text);
data.family_Sec_list.Add(name.Text);
data.phoneno_Sec_list.Add(name.Text);

当我在Form2上并且想要使用我的列表时我不能这样我应该从Trans类创建对象,这项工作将使列表值null

4 个答案:

答案 0 :(得分:1)

你可以使用单身人士模式:

class Trans {

    private static Trans instance;

    private Trans() { }

    public static Trans Instance() {
        if (instance == null) {
            instance = new Trans();
        }
        return instance;
    }
    ...
}

以第一种形式使用它:

Trans trans = Trans.Instance();
trans.name_Sec_list ....

以第二种形式使用它:

Trans trans = Trans.Instance();
trans.name_Sec_list ....

答案 1 :(得分:1)

正如其他人所建议的那样,快速解决方案可能是使属性保持静态。但是,这可能会引入新的问题,例如可测试性,并且违反了清洁代码原则。

Singleton方法已经更好了,因为您可以将其配置为返回单元测试的测试对象。但是,获取Singleton需要一个静态方法,可以在整个地方再次调用它。

因此,静态属性和Singletons都会增加Spaghetti代码的可能性。那是因为你无法控制谁可以访问数据,谁也无法访问数据。

你没有确切地说明你有多少表格,如何打开等等所以我需要做一些假设。

主要方法可能如下所示:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    var data = new Trans();
    var secondForm = new Form2 {Trans = data};
    var mainForm = new Form1 {SubForm = secondForm, Trans = data };
    Application.Run(mainForm);
}

我修改了Trans类,使其不再具有静态项目。我也修了那个课,因为恕我直言,它有一个复制/粘贴问题。您可能会为测试目的引入所有_Sec_内容,因此可能会将其删除(它们会返回相同的对象,但不能解决任何问题)。

class Trans
{
    public List<string> name_list = new List<string>();
    public List<string> family_list = new List<string>();
    public List<string> phoneno_list = new List<string>();

    public List<string> name_Sec_list { set { name_list = value; } get { return name_list; } }
    public List<string> family_Sec_list { set { family_list = value; } get { return family_list; } }
    public List<string> phoneno_Sec_list { set { phoneno_list = value; } get { return phoneno_list; } }
}

你能在这看到什么?

  • Form1Form2都可以访问数据,因此可以解决您的问题。
  • Main()方法可以控制谁获取哪些数据。每个需要这些数据的人都可以获得数据。
  • 没有其他人可以访问数据。虽然每个人都可以new自己Trans,但这只是空的。
  • 由于没有任何static,您可以在单元测试期间安全地使用new Trans个实例而不会产生任何副作用
  • 表单本身不会创建依赖项。现在将依赖项注入表单中。这使得可以在单元测试中通过具有定义的测试行为的模拟对象替换它。 (另一个问题是你是否应该在单元测试中测试UI,但这是一个不同的主题。)

答案 2 :(得分:0)

您的Trans课程中已有3个静态列表,如果您想使用它们,请将其他静态列表设为静态列表:

public class Trans
{
    public static List<string> name_list = new List<string>();
    public static List<string> family_list = new List<string>();
    public static List<string> phoneno_list = new List<string>();

    public static List<string> name_Sec_list = new List<string>();
    public static List<string> family_Sec_list = new List<string>();
    public static List<string> phoneno_Sec_list = new List<string>();
}

然后,在您想要使用这些列表的任何地方,您应该像以下一样访问它们:

Trans.name_Sec_list.Add(name.Text);

现在,您可以以任何形式使用这些列表。

答案 3 :(得分:0)

只需使用静态类

  public static class Trans
    {
        public static List<string> name_list = new List<string>();
        public static List<string> family_list = new List<string>();
        public static List<string> phoneno_list = new List<string>();
    }

用法

Trans.name_list.Add(string);

我将静态类放在一个单独的项目中,以便在需要时可以在其他地方引用它。但只在需要的时候。