有没有一种方法可以在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的困惑——或者问题的例子与实际问题无关