c# - C#记录构造函数参数默认值空IEnumerable
问题描述
我正在转换这个类
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
. 绝对没有其他东西可以粘在那里。但!您可以在显式声明的“长格式”自动属性的初始化中从主构造函数中引用该属性。这将允许您合并分配给属性的值。
public record MyRecord(IEnumerable<string>? Strings = null)
{
public IEnumerable<string> Strings { get; init; } = Strings ?? Enumerable.Empty<string>();
}
这实际上为您的记录生成了一个构造函数,类似于您最初的构造函数。以下是上述链接为构造函数生成的内容(可空属性转换回?
):
public MyRecord(IEnumerable<string>? Strings = null)
{
<Strings>k__BackingField = Strings ?? Enumerable.Empty<string>();
base..ctor();
}
它比单行更冗长/不那么紧凑,但它是用 a 完成你所要求的唯一方法,record
它仍然比非record
版本短。
另请注意,如果您查看生成的代码,该属性最终被声明为不可空,而构造函数参数可空。将此与您开始使用的单行版本进行比较,其中生成的参数可以为空以匹配主构造函数声明。在此解决方案中,您可以更改此行为(如果需要)并显式将长格式属性标记为可为空。
推荐阅读
- android - 如何从firebase android中删除数据
- r - 为拆分条形图 ggplot2 着色 x 轴标签
- spring-boot - 如何防止 Spring Boot 在模态中为某些特定字段创建列
- string - AutoIt 字符串变量二进制安全吗?我可以在那里存储二进制数据吗?
- gerrit - 在 Gerrit 中,我们如何评论二进制文件?
- vue.js - v-html 不在 div 内呈现动态 HTML 数据
- javascript - Vue.js - 子组件在更新其位置时重新渲染
- actionscript-3 - 在影片剪辑内的影片剪辑中加载图像
- javascript - React Native createStackNavigator 和 createBottomTabNavigator
- java - 我在查找二叉搜索树 Java 程序中的父节点时遇到问题