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?

C#重复类实例化是不必要的

根据您给出的示例,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循环的范围之外实例化它,尤其是在创建成本很高的情况下。

相关文章: