C# 静态与实例方法的使用

C# 静态与实例方法的使用,c#,C#,我有一个类,它有一些方法,我在代码中使用这些方法。他们的目标是生成一个对象并将其返回以供进一步使用。我可以用两种方式实现它。第一种方法是将其设置为静态,如下所示: public static class Builder { public static MyObject BuildMyObject(Settings myEnumSetting, int someParam) { //Building object return MyObject;

我有一个类,它有一些方法,我在代码中使用这些方法。他们的目标是生成一个对象并将其返回以供进一步使用。我可以用两种方式实现它。第一种方法是将其设置为静态,如下所示:

public static class Builder
{
    public static MyObject BuildMyObject(Settings myEnumSetting, int someParam)
    {
        //Building object 
        return MyObject;
    }

    //Other methods          
}
public class Builder
{
    public MyObject BuildMyObject(Settings myEnumSetting, int someParam)
    {
        //Building object 
        return MyObject;
    }

    //Other methods          
}
MyObject obj = Builder.BuildMyObject(Settings.Worker,20);
MyObject obj = new Builder().BuildMyObject(Settings.Worker,20);
另一种方法是使其成为如下实例:

public static class Builder
{
    public static MyObject BuildMyObject(Settings myEnumSetting, int someParam)
    {
        //Building object 
        return MyObject;
    }

    //Other methods          
}
public class Builder
{
    public MyObject BuildMyObject(Settings myEnumSetting, int someParam)
    {
        //Building object 
        return MyObject;
    }

    //Other methods          
}
MyObject obj = Builder.BuildMyObject(Settings.Worker,20);
MyObject obj = new Builder().BuildMyObject(Settings.Worker,20);
在第一种方式中,您可以像这样创建我的对象:

public static class Builder
{
    public static MyObject BuildMyObject(Settings myEnumSetting, int someParam)
    {
        //Building object 
        return MyObject;
    }

    //Other methods          
}
public class Builder
{
    public MyObject BuildMyObject(Settings myEnumSetting, int someParam)
    {
        //Building object 
        return MyObject;
    }

    //Other methods          
}
MyObject obj = Builder.BuildMyObject(Settings.Worker,20);
MyObject obj = new Builder().BuildMyObject(Settings.Worker,20);
在第二种情况下,我可以这样使用它:

public static class Builder
{
    public static MyObject BuildMyObject(Settings myEnumSetting, int someParam)
    {
        //Building object 
        return MyObject;
    }

    //Other methods          
}
public class Builder
{
    public MyObject BuildMyObject(Settings myEnumSetting, int someParam)
    {
        //Building object 
        return MyObject;
    }

    //Other methods          
}
MyObject obj = Builder.BuildMyObject(Settings.Worker,20);
MyObject obj = new Builder().BuildMyObject(Settings.Worker,20);
以下哪种方法的使用效率更高

以下哪种方法的使用效率更高


这取决于您的需求,如果类的唯一责任是创建一个对象并返回它,那么使用
static
类的第一个选项更好

使用静态方法更简单。一个实例方法为构建器的继承层次结构打开,您可以使用某种依赖注入来选择要使用的构建器

如果静态方法有效-现在就使用它。您始终可以将静态方法转换为一个facade,该facade在以后隐藏继承的构建器类的层次结构的细节


顺便说一下:我会使用名称
Factory
而不是
Builder
,因为这是一个Factory方法模式实现的示例。生成器是另一种(更复杂的)模式。

您描述的概念称为工厂模式。 通常,构建器不使用任何实例成员,因此它应该是静态的


当存在成员的内聚时,应该使用实例()。例如,在同一组实例变量(字段)上操作的方法属于同一个实例。

如果这个类只返回一个新对象,那么我认为静态方式更好,因为您没有在那个类或其他什么地方存储数据

因此,静态方法比其他方法更有效。(例如,我不认为创建这个类的10个对象是有用的)


您的类是一个工厂类/模式

静态(工厂)类的优点是,您可以跟踪在某些静态属性中创建的对象。根据您的需求,这可能非常有用。

一般来说,我建议使用静态方法。这是一个已知模式的特例,请参阅可能的副本,谢谢您的回答。我应该在什么时候使用实例方法,而不是?@voo,当您实际要处理实例时,例如维护每个对象的实例成员等。在您当前的示例中,您的类实例(实例内方法)没有在任何地方使用。你甚至没有保留引用,所以一开始就没有必要保留它,除非它是依赖关系injected@voo,另请参见:
静态类和类成员用于创建无需创建类实例即可访问的数据和函数。
在@voo中,您可以使用基于实例的方法来配置生成器。例如,如果您需要能够将其配置到测试的生产中。