是否可以在基类构造函数中使用对象初始化器语法?
基类构造函数中使用对象初始化器的问题解答
首先明确说:你没法直接在基类构造函数调用(也就是: base()这部分)里使用对象初始化器语法——因为对象初始化器是C#提供的语法糖,本质是先调用构造函数创建对象,再逐个设置属性,它和基类构造调用的执行时机不兼容,所以你写的那段代码会被编译器判定为无效语法。
那怎么实现类似的效果呢?这里给你几个可行的方案:
方案1:在派生类构造函数体内直接设置属性
这是最直接的方式,把你原来写的逗号改成分号即可,因为构造函数体里的代码是逐行执行的,需要符合C#的语句语法:
class MyForm : Form { public MyForm(string caption) : base() { Width = 500; Height = 150; FormBorderStyle = FormBorderStyle.FixedDialog; Text = caption; StartPosition = FormStartPosition.CenterScreen; } }
方案2:用对象初始化器创建派生类实例
如果你希望保留初始化器的简洁写法,可以把属性配置移到实例化派生类的时候,而不是硬编码在构造函数里:
// 实例化时用初始化器配置属性 MyForm myForm = new MyForm("Hello world!") { Width = 500, Height = 150, FormBorderStyle = FormBorderStyle.FixedDialog, StartPosition = FormStartPosition.CenterScreen };
这种方式的好处是把构造逻辑和属性配置分离,灵活性更高,也符合你习惯的初始化器语法。
方案3:封装初始化方法(适合复用默认配置)
如果这些属性是这个派生类的默认配置,而且需要在多个构造函数里复用,可以把初始化逻辑抽成一个私有方法:
class MyForm : Form { public MyForm(string caption) : base() { InitializeDefaultSettings(caption); } // 重载构造函数也可以复用这个方法 public MyForm() : this("Default Caption") { } private void InitializeDefaultSettings(string caption) { Width = 500; Height = 150; FormBorderStyle = FormBorderStyle.FixedDialog; Text = caption; StartPosition = FormStartPosition.CenterScreen; } }
补充一句为啥原来的写法不行:你写的base() { ... }里的大括号,编译器会把它当成派生类构造函数的主体,而不是对象初始化器。初始化器的语法只能跟在new关键字后面,不能放在构造函数调用的后面,所以里面的逗号分隔属性的写法就不符合C#语句的语法规则了。
内容的提问来源于stack exchange,提问作者Tomáš Zato
相关产品推荐
相关产品推荐

