有没有一种方法可以在C#中初始化类值?

有没有一种方法可以在C#中初始化类值?,c#,object,dry,C#,Object,Dry,假设我有一门课: class Foo { private int blah; private char bleh; private string bluh; //... public Foo() { } } 现在通常,我必须这样初始化它: public Foo(int blah, char bleh, string bluh,...) {

假设我有一门课:

class Foo
    {
        private int blah;
        private char bleh;
        private string bluh;
        //...
        public Foo()
        {
        }
    }
现在通常,我必须这样初始化它:

    public Foo(int blah, char bleh, string bluh,...)
    {
        this.blah=blah;
        this.bleh=bleh;
        this.bluh=bluh;
        //...
    }
这很无聊,而且似乎没有遵循“不要重复你自己”的原则,所以我正在寻找更好的解决方案。这可以用烘干机来做吗

编辑:将变量更改为private以反映更常见的用例

class Foo
{
    public readonly int blah;
    public readonly char bleh;
    public readonly string bluh;
    //...
    public Foo(int blah, char bleh, string bluh)
    {
        this.blah=blah;
        this.bleh=bleh;
        this.bluh=bluh;
        //...
    }
}
可以作为记录类型写入,并且是一个很好的候选者,因为它是不可变的。要将上述内容重写为记录,只需使用

public record Foo(int blah, char bleh, string bluh);

在我看来,这要干净得多,而且似乎正是您所追求的。

如果您确实不想重复自己的操作,请在初始化变量/属性时使用对象初始化

像这样

Foo f = new foo{
    blah = 1;
    bleh = 'A';
    bluh = "something";
};

另外,不要在字段中使用公共访问器,这不好。

“这很枯燥,而且似乎没有遵循“不要重复自己”的方法。你有一个bug。您使用的是字段而不是属性。修复错误。至于DRY-此处没有任何内容违反DRY原则DRY原则与您的示例无关。您可以使用记录类型,
public record Foo(int-blah,char-bleh,string-bluh,…)
并将变量分配给blah,bleh,bluh等。它允许您创建一个完整的类作为一个1行程序。这不是DRY的意思。DRY是关于有形的逻辑片段,而不是关于变量初始化。记录不仅仅是使构造函数更干净。这可能会产生连锁反应。如果您希望不可变,则只应使用记录。“这是否是OP想要的还不清楚。@在第一个例子中,利亚姆在编辑问题之前,当本发布这个答案时,OP使用了
readonly
字段,这表明可能的不可变类
只读
与immutability@Liam只读字段在创建后不能更改其值。首先没有DRY。无参数构造函数意味着所有属性都是可选的,并允许使用defaults部分初始化类或结构。该答案不会删除(不存在)重复,而是更改类的内容allows@PanagiotisKanavos我认为他不想使用构造函数只是为了不真正“重复自己”所以我使用对象初始化只是为了删除构造函数和参数的初始化,而没有删除构造函数调用。您调用了无参数构造函数,然后为已构造的对象赋值
newfoo{}
相当于
newfoo(){}
。您甚至可以使用参数,如果这样的构造函数可用的话,例如
newfoo(abc){…}
在这个问题中没有要删除的重复。这个问题显示了对DRY的困惑——或者问题的例子与实际问题无关