我有一个有几个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
。
答案 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; } }
}
你能在这看到什么?
Form1
和Form2
都可以访问数据,因此可以解决您的问题。Main()
方法可以控制谁获取哪些数据。每个需要这些数据的人都可以获得数据。new
自己Trans
,但这只是空的。static
,您可以在单元测试期间安全地使用new
Trans
个实例而不会产生任何副作用答案 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);
我将静态类放在一个单独的项目中,以便在需要时可以在其他地方引用它。但只在需要的时候。