如何避免构造函数中的私有成员赋值

本文关键字:成员 赋值 何避免 构造函数 | 更新日期: 2023-09-27 18:03:57

我经常发现自己这样做:

class MyClass
{
    public MyClass(int x)
    {
        this.x = x;
    }        
    private int x;
    ...
}

每次为配置添加新的私有成员变量时,都需要将其添加到构造函数的参数列表、构造函数体和类中作为成员。有没有一种好的编程模式可以避免额外的输入?

如何避免构造函数中的私有成员赋值

一般来说,如果你用一堆私有成员实例化一个类,你必须把它们传递给构造函数,你就已经在做一些有问题的事情了。

MyClass myClass = new MyClass(x, y, z, 7, 'c', someOtherClass)

如果合适,可以将相关字段封装到结构体或不同的类中,如

class MyClass
{
    public MyClass(Coordinates coords)
    {
        this.coords = coords;
    }
    private Coordinates coords;
}
public struct Coordinates
{
     public int X{get; set;}
     public int Y{get; set;}
     public int z{get; set;}
}

然后你可以用

实例化
MyClass myClass = new MyClass(new Coordinates() { X = 1, Y = 2, Z = 3 });

如果没有特定的实现,很难确定最佳解决方案,但如果您实际上不必从类外部设置字段,则可以这样做

class MyClass
{
    public MyClass()
    {
    }        
    private int x = 2;
    ...
}

class MyClass
{
    public MyClass()
    {
        this.x = 2;
    }        
    private int x;
    ...
}

我发现我可以滥用继承来实现我的目标。我设置了一个"Loader"子类,其唯一目的是插入基类的依赖项。然后我们就可以使用基类,而不用考虑加载器了。

然后,这又有一个可怕的副作用,即阻止在基构造函数中使用这些受保护的成员变量——我们需要使用. start()函数或类似的函数来代替。所以,这是一个非常糟糕的解决方案,尽管节省了一些按键。
public class MyClass
{
    protected int param1;
    protected int param2;
    public void DoStuff()
    {
        Console.WriteLine(param1 + param2);
    }
}

public class MyClassLoader : MyClass
{
    public MyClassLoader()
    {
        param1 = 1;
        param2 = 2;
    }
}
class Program
{
    static void Main(string[] args)
    {
        MyClass myObj = new MyClassLoader();
        myObj.DoStuff();
        Console.WriteLine("Press any key to quit.");
        Console.ReadKey();
    }
}