C#中能否在字段初始化器中直接使用多行代码块?
在C#字段初始化器中实现多行复杂逻辑的可行方案
你提到的直接用{}包裹多行代码的写法不合法,因为字段初始化器要求的是表达式,而代码块属于语句范畴,编译器无法直接将其转换为可赋值的结果。不过无需把逻辑移到单独方法,有两种直接在初始化器里实现的方案:
方案1:使用立即执行的Func委托
将多行逻辑封装到Func<string>委托的方法体中,然后立即调用这个委托获取返回值:
public class MyClass { private string _stringField = new Func<string>(() => { var stringGenerator = new StringGenerator(); stringGenerator.SetSomething("bla"); return stringGenerator.GetString(); })(); }
方案2:C# 9.0+ 简化的目标类型推断写法
利用C# 9.0引入的目标类型推断,配合强制转换和立即执行,代码更简洁:
public class MyClass { private string _stringField = ((Func<string>)() => { var stringGenerator = new StringGenerator(); stringGenerator.SetSomething("bla"); return stringGenerator.GetString(); })(); }
注意事项
- 字段初始化器在类实例构造函数执行前运行,因此内部无法访问类的非静态实例成员(此时这些成员还未完成初始化)。
- 如果需要处理异常,可以直接在委托的代码块内添加
try-catch逻辑。
内容的提问来源于stack exchange,提问作者scharnyw
相关产品推荐
相关产品推荐

