C# 类属性初始化

Ser*_*iob -1 .net c# initialization

在其他现代编程语言中,当父类具有多个构造函数时,可以初始化只读属性,而无需重复代码。但 C# 似乎有一个相当烦人的限制。例如我有以下 C# 类:

class MyClass
{
    string? str1 { get; init; }
    string? str2 { get; init; }

    public MyClass(string s1)
    {
       this.str1 = s1;
       this.str2 = null;
    }

    public MyClass(string s1, string s2)
    {
       this.str1 = s1;
       this.str2 = s2;
    }
}
Run Code Online (Sandbox Code Playgroud)

可以修改构造函数来部分解决问题,如以下代码所示:

class MyClass
{
    string? str1 { get; init; }
    string? str2 { get; init; }

    public MyClass(string s1): this(s1, null) { }

    public MyClass(string s1, string s2)
    {
       this.str1 = s1;
       this.str2 = s2;
    }
}
Run Code Online (Sandbox Code Playgroud)

但问题是,对第一个构造函数的调用将失败,因为我为 s2 传递了 null 而不是非 null 值。我可以在第二个构造函数中将 s2 参数声明为可为空,但这是一种解决方法,无法解决总体问题。上面的示例仅用于解释目的,但我有一个需要依赖注入的真实情况,并且我有多个具有公共代码的构造函数和几个只读属性,这些属性必须在第一次创建对象时初始化,并且之后永远不会修改。我错过了什么吗?其他语言有不同的方法来与多个构造函数共享初始化代码并处理我之前解释过的问题,但 C# 在这方面似乎相当有限。预先感谢您为解决此问题提供的任何帮助。

Mar*_*ell 5

这里有很多选择:

“去做就对了”

class MyClass
{
    string str1 { get; }
    string? str2 { get; }

    public MyClass(string s1) : this(s1, null!) { }

    public MyClass(string s1, string s2)
    {
        this.str1 = s1;
        this.str2 = s2;
    }
}
Run Code Online (Sandbox Code Playgroud)

“只可以有一个人”

class MyClass
{
    string str1 { get; }
    string? str2 { get; }

    public MyClass(string s1, string? s2 = null)
    {
        this.str1 = s1;
        this.str2 = s2;
    }
}
Run Code Online (Sandbox Code Playgroud)

“我讨厌选项”

class MyClass
{
    string str1 { get; }
    string? str2 { get; }

    public MyClass(string s1) : this(s1, null) { }

    public MyClass(string s1, string? s2)
    {
        this.str1 = s1;
        this.str2 = s2;
    }
}
Run Code Online (Sandbox Code Playgroud)

“不要重复自己”

class MyClass
{
    string str1 { get; }
    string? str2 { get; }

    public MyClass(string s1, string s2) : this(s1) => str2 = s2;
    public MyClass(string s1) => str1 = s1;
}
Run Code Online (Sandbox Code Playgroud)

“懒惰模式”

class MyClass(string s1, string? s2 = null)
{
    string str1 => s1;
    string? str2 => s2;
}
Run Code Online (Sandbox Code Playgroud)

“让记录表明”

record class MyClass(string str1, string? str2 = null);
Run Code Online (Sandbox Code Playgroud)