C#重复类实例化是不必要的
本文关键字:不必要 实例化 | 更新日期: 2023-09-27 18:30:11
我有主类:
class MainClass
{
public static void Main()
{
InputForm InputForm1 = new InputForm();
InputForm1.ShowDialog(); // show interface to prompt user
}
}
它只是调用一个windows窗体。它有以下类:
public partial class InputForm : Form
{
public InputForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// do some calculation and then create a dictionary of items
for (int n = 1; n <= dict.Count; n++) // loop through items
{
LengthClass theLength = new LengthClass();
dict[n].calculatedLength = theLength.calcLength(arg1, arg2, dict[n].speed);
}
}
}
单击该按钮时,程序会对从电子表格中读取的数据进行一些计算,并将结果保存到词典中。每个元素都是一种动物,我在字典中存储了一些属性(例如,在"Dog"键下,我有狗的平均重量、平均速度等)。使用速度和两个默认参数(arg1和arg2),我必须调用LengthClass类的方法,才能获得特定动物在arg1小时和arg2分钟内覆盖的估计长度。LengthClass是这样的:
class LengthClass
{
public double calcLength(double arg1, double arg2, double speed)
{
// do some calculation
return x;
}
}
现在我的疑问是如何更好地设计代码。当循环遍历字典中的每个键时,我每次都实例化一个LengthClass并调用它的方法。这样做对吗?我希望将计算长度的方法与windows窗体中的代码分开,以便在必要时更容易进行更改。但我认为,每次实例化类可能会减慢代码的速度,更好的设计可以保持代码的快速易读。有什么建议吗?
由于下面的答案,将方法calcLength声明为static似乎可以解决问题,并避免LengthClass的重复实例化。但是,如果LengthClass有一个额外的方法,比如calcLength2(),为了执行计算,需要调用一个新类的方法,例如helpClass,我是否需要将helpClass的方法声明为静态,以避免在LengthClass中从我的calcLenlength 2()调用其方法时实例化helpClass?
根据您给出的示例,calcLength
方法不需要是实例方法,因为它不使用LengthClass
的任何字段。您可以通过将此方法设置为静态来避免或完全避免对象创建:
class LengthClass
{
public static double calcLength(double arg1, double arg2, double speed)
{
// do some calculation
return x;
}
}
那么你可以这样称呼它:
public partial class InputForm : Form
{
public InputForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// do some calculation and then create a dictionary of items
for (int n = 1; n <= dict.Count; n++) // loop through items
{
dict[n].calculatedLength = LengthClass.calcLength(arg1, arg2, dict[n].speed);
v = myPort[n].midVol;
}
}
}
进一步扩展Sam Holder的好答案,似乎您的LengthClass最好标记为静态。感觉不应该创建LengthClass
的实例,尤其是因为它不包含任何持久成员。最好用类来描述属性的UML准则可能会有所帮助。
static class LengthClass
{
public static double calcLength(double arg1, double arg2, double speed)
{
// do some calculation
return x;
}
}
和用法:
private void button1_Click(object sender, EventArgs e)
{
for (int n = 1; n <= dict.Count; n++) // loop through items
{
dict[n].calculatedLength = LengthClass.calcLength(arg1, arg2, dict[n].speed);
v = myPort[n].midVol;
}
}
另一个技巧是,如果确实需要LengthClass作为对象,那么最好在for循环的范围之外实例化它,尤其是在创建成本很高的情况下。