将"view = new Person"
置于按钮事件处理程序中是否可以?如果我不这样做,并将其放在Form1构造函数中,则只添加我的最后一个值。如果我想声明一个新实例然后将它添加到我的Arraylist中,这是正确的方法吗?
private ArrayList store;
public Form1()
{
InitializeComponent();
store = new ArrayList();
}
private void Form1_Load(object sender, EventArgs e)
{ }
private void button1_Click(object sender, EventArgs e)
{
//Is it okay to declare a new instance of the Person class
// with each button push?
Person view = new Person();
view.firstname = txtFirstName.Text;
view.lastname = txtLastName.Text;
store.Add(view);
txtFirstName.Clear();
txtLastName.Clear();
}
private void button2_Click(object sender, EventArgs e)
{
foreach (Person display in store)
{
MessageBox.Show(display.ToString());
}
}
答案 0 :(得分:5)
可以在按钮事件处理程序中放置“view = new Person”吗?
是。如果您的目标是在每次单击按钮时创建一个新人,那么这是合适的。
旁注:您应该考虑使用List<Person>
代替ArrayList
。这是较新的,类型安全的列表类(从.NET 2.0开始),并且使用起来更好。
答案 1 :(得分:0)
这看起来像完全你应该做什么。
我想你在某个地方读过你应该避免做一些复杂的事情,比如在表单的事件处理程序中实例化对象。这听起来像是一个名为“模型 - 视图 - 控制器”的应用程序设计模式,为了实现它,你将有一个类,与你的WinForm分开,包含单击按钮时应该执行的逻辑,以及表单的而是将控件链接到此Controller的方法,而不是包含其自己的处理程序的表单。它有其优点,但对于普通的小项目来说,没有必要。继续做你正在做的事情,这很好。
有几点:首先,除非你在.NET 1.1中进行编码,否则ArrayList通常不是一件好事。从.NET 2.0开始,该语言引入了一个称为泛型的概念,泛型允许您执行的主要操作之一是指定集合可以包含的对象类型。 System.Collections.Generics.List<T>
类是store
的更好选择,如果它将存储的全部是人;将声明更改为private List<Person> store;
。使用泛型集合的优点是需要返回对象的代码将知道对象是什么类型,因为集合将禁止向其添加不同类型的对象。
其次,在定义事件处理程序之前,在将它们放入设计器中时将其命名。代码应该是自我记录的,名为“button1”的按钮不会告诉我们它应该做什么。如果您在将其从工具箱拖到窗体上之后将此按钮命名为“CreatePersonButton”,则当您双击它以定义其行为时,事件处理程序将命名为“CreatePersonButton_Click”,这更具描述性。