如果它使用了很多地方,我很困惑在哪里宣布课程。
假设我有一个名为订单的表单,其中我执行了四项任务,例如 插入,更新和删除以及填写订单数据。
所有这四项任务的逻辑都在单独的类文件中说 FinalOrder.cs
在这里,例如 fo 即时创建名为 FinalOrder 的类,并且不同的方法从 FinalOder 调用到订单形成。
以下是推荐代码:
第一种方式:
FinalOrder fo = new FinalOrder();
private void Order_Load(object sender, EventArgs e)
{
dgvOrder.DataSource = fo.FetchOrders();
}
private void btnNewOrder_Click(object sender, EventArgs e)
{
fo.NewOrder();
}
private void btnUpdateOrder_Click(object sender, EventArgs e)
{
fo.UpdateOrder();
}
private void btnDiscardOrder_Click(object sender, EventArgs e)
{
fo.DiscardOrder();
}
第二种方式:
private void Order_Load(object sender, EventArgs e)
{
FinalOrder fo = new FinalOrder();
dgvOrder.DataSource = fo.FetchOrders();
}
private void btnNewOrder_Click(object sender, EventArgs e)
{
FinalOrder fo = new FinalOrder();
fo.NewOrder();
}
private void btnUpdateOrder_Click(object sender, EventArgs e)
{
FinalOrder fo = new FinalOrder();
fo.UpdateOrder();
}
private void btnDiscardOrder_Click(object sender, EventArgs e)
{
FinalOrder fo = new FinalOrder();
fo.DiscardOrder();
}
第三种方式:
FinalOrder fo;
public Order()
{
InitializeComponent();
fo = new FinalOrder();
}
private void Order_Load(object sender, EventArgs e)
{
dgvOrder.DataSource = fo.FetchOrders();
}
private void btnNewOrder_Click(object sender, EventArgs e)
{
fo.NewOrder();
}
private void btnUpdateOrder_Click(object sender, EventArgs e)
{
fo.UpdateOrder();
}
private void btnDiscardOrder_Click(object sender, EventArgs e)
{
fo.DiscardOrder();
}
请解释一下,在记住内存分配的情况下使用哪个好,为什么?
答案 0 :(得分:2)
第一种和第三种方式是相同的;在创建FinalOrder
实例时,两者都将实例化Form
。
如果您的应用中有许多insert
/ delete
/ update
个操作,那么请使用第一种或第三种方式阻止每次实例化FinalOrder
正在调用这些方法。
答案 1 :(得分:1)
我想说这取决于FinalOrder
和它创建的类的特征。例如,如果创建它的类可以被多个线程访问,那么除非FinalOrder
是线程安全的,否则你可能不希望它作为成员变量。
(在您的示例中,它看起来像是在Web表单上创建的,并且将其作为成员变量是安全的。)
同样,FinalOrder
对象中的操作可能会改变对象的状态(必须看到函数的实现),这可能会改变未来操作的工作方式,并且它将以不同的方式工作在每次使用之前重新创建它。
答案 2 :(得分:1)
我认为您的“订单”表单仅用于一个订单。所以,如果是第二种方式更好。如果您要更好地插入/更新/删除第1或第3路,因为它们只使用了一个实例。
答案 3 :(得分:1)
为什么不使用Singleton模式,或者您可以通过在FinalOrder类中编写返回FinalOrder类实例的属性来共享FinalOrder类的实例。因此,您可以避免在另一个类上创建实例。
答案 4 :(得分:1)
如果FinalOrder
是一个不使用任何昂贵资源的简单类,那么我会选择第二种方式它会使对象生命周期缩短并封装在函数中以简化重用。
如果FinalOrder
使用非托管资源或IDisposable
,那么我会选择...
第四种方式
class FinalOrder : IDisposible
{
...
}
private void OrderLoad(object sender, EventArgs e)
{
using (var fo = new FinalOrder(...))
{
dgvOrder.DataSource = fo.FetchOrders();
}
}
如果FinalOrder的实例化非常昂贵,那么我可以考虑使用私有成员来处理常见的FinalOrder
实例,但理想情况下我会避免这种情况。