C#中如何将多个Data字段的声明与初始化合并为单行?
问题
异常信息:未将对象引用设置到对象的实例。
如何将以下多个C#字段的声明与初始化操作合并为单行代码?
示例代码:
private Data model1 = new Data { M1 = 0, M2 = 0 }; private Data model2 = new Data { M1 = 0, M2 = 0 }; private Data model3 = new Data { M1 = 0, M2 = 0 }; private Data model4 = new Data { M1 = 0, M2 = 0 }; private Data model5 = new Data { M1 = 0, M2 = 0 }; ....
期望的写法示例:
private MyData model1, model2, model3, model4, model5 = new MyData {Max = 0, Min = 0};
解答
你期望的写法存在陷阱:这种语法里只有最后一个变量model5会被初始化,model1到model4都会保持默认的null值,这正是触发“未将对象引用设置到对象的实例”异常的原因。
要在单行完成所有字段的声明和初始化(每个字段都拥有独立的Data实例),需要为每个字段单独赋值,写法如下:
private Data model1 = new Data { M1 = 0, M2 = 0 }, model2 = new Data { M1 = 0, M2 = 0 }, model3 = new Data { M1 = 0, M2 = 0 }, model4 = new Data { M1 = 0, M2 = 0 }, model5 = new Data { M1 = 0, M2 = 0 };
如果觉得重复代码冗余,可以封装一个创建默认Data实例的方法来简化:
private Data CreateDefaultData() => new Data { M1 = 0, M2 = 0 }; private Data model1 = CreateDefaultData(), model2 = CreateDefaultData(), model3 = CreateDefaultData(), model4 = CreateDefaultData(), model5 = CreateDefaultData();
另一种更简洁的方案是用数组或集合来管理这些实例,避免声明大量单独字段:
// 注意:如果所有实例可以共享同一个引用(不修改实例属性),可以用Repeat private Data[] models = Enumerable.Repeat(new Data { M1 = 0, M2 = 0 }, 5).ToArray(); // 如果每个实例需要独立(各自拥有自己的属性值),改用Select创建新实例 private Data[] models = Enumerable.Range(0,5).Select(_ => new Data { M1 = 0, M2 = 0 }).ToArray();
内容的提问来源于stack exchange,提问作者st27
相关产品推荐
相关产品推荐

