C#记录构造函数参数默认值空IEnumerable
C# records constructor parameter default value empty IEnumerable
我正在转换这个class
public class MyClass
{
public IEnumerable<string> Strings { get; }
public MyClass(IEnumerable<string>? strings = null)
{
Strings = strings ?? new List<string>();
}
}
给个记录。目前我有这个:
public record MyRecord(IEnumerable<string>? strings = null);
但是,我找不到将 IEnumerable
默认初始化为空可枚举的方法,因为它必须是编译时常量。我尝试静态初始化一个只读数组,但同样的问题。
由于IEnumerable<string>
是引用类型,唯一可能的默认参数是null
。绝对没有其他东西可以坚持下去。但!您 可以 在显式声明的“长格式” auto-[=38 的初始化中从 主构造函数 引用 属性 =].这将允许您合并分配给 属性.
的值
public record MyRecord(IEnumerable<string>? Strings = null)
{
public IEnumerable<string> Strings { get; init; } = Strings ?? Enumerable.Empty<string>();
}
这实际上为您的记录生成了一个类似于您最初拥有的构造函数。以下是上面的 link 为构造函数生成的内容(可空 属性 转换回 ?
):
public MyRecord(IEnumerable<string>? Strings = null)
{
<Strings>k__BackingField = Strings ?? Enumerable.Empty<string>();
base..ctor();
}
它比单线verbose/not更紧凑一点,但这是用 record
完成您要求的唯一方法,而且它仍然比非 [=15] 短=] 版本.
另请注意,如果您查看生成的代码,属性 最终被声明为不可为空,而构造函数参数为可空。将此与您开始使用的单行版本进行比较,其中生成的参数可以为空以匹配主构造函数声明。在此解决方案中,您 可以 更改此行为(如果需要)并显式标记长格式 属性 也可为空。
我正在转换这个class
public class MyClass
{
public IEnumerable<string> Strings { get; }
public MyClass(IEnumerable<string>? strings = null)
{
Strings = strings ?? new List<string>();
}
}
给个记录。目前我有这个:
public record MyRecord(IEnumerable<string>? strings = null);
但是,我找不到将 IEnumerable
默认初始化为空可枚举的方法,因为它必须是编译时常量。我尝试静态初始化一个只读数组,但同样的问题。
由于IEnumerable<string>
是引用类型,唯一可能的默认参数是null
。绝对没有其他东西可以坚持下去。但!您 可以 在显式声明的“长格式” auto-[=38 的初始化中从 主构造函数 引用 属性 =].这将允许您合并分配给 属性.
public record MyRecord(IEnumerable<string>? Strings = null)
{
public IEnumerable<string> Strings { get; init; } = Strings ?? Enumerable.Empty<string>();
}
这实际上为您的记录生成了一个类似于您最初拥有的构造函数。以下是上面的 link 为构造函数生成的内容(可空 属性 转换回 ?
):
public MyRecord(IEnumerable<string>? Strings = null)
{
<Strings>k__BackingField = Strings ?? Enumerable.Empty<string>();
base..ctor();
}
它比单线verbose/not更紧凑一点,但这是用 record
完成您要求的唯一方法,而且它仍然比非 [=15] 短=] 版本.
另请注意,如果您查看生成的代码,属性 最终被声明为不可为空,而构造函数参数为可空。将此与您开始使用的单行版本进行比较,其中生成的参数可以为空以匹配主构造函数声明。在此解决方案中,您 可以 更改此行为(如果需要)并显式标记长格式 属性 也可为空。