关于C#构造函数重载

原创
2019/03/14 18:30
阅读数 11

2019/03/14 今天在书写客户端Demo程序时,发现了一处自己忽略的知识点,关于C#的构造函数重载和默认参数的问题。 按照我的理解,C#对于采用具有默认值参数的构造函数,应当可以与无参构造函数一样使用。 实际场景中,我编写了一个WPF程序,对程序主窗口的构造函数添加了具有默认值的参数,此时MainWindow类型不具有无参构造函数;然后在程序的添加了一个Main函数入口,在其中执行以下代码: _app = new App() { StartupUri = new Uri("pack://application:,,,/AutoUpdater;component/MainWindow.xaml") }; _app.InitializeComponent(); _app.Run(); 结果总是在Run()方法上发生异常。 猜测可能是无法构造MainWindow,因此又添加了一个无参构造函数,编译后使用ildasm查看IL代码,无参构造函数的IL代码如下: .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // 代码大小 34 (0x22) .maxstack 8 IL_0000: ldarg.0 而带有参数的构造函数IL代码如下: .method public hidebysig specialname rtspecialname instance void .ctor([opt] string clientType, [opt] string moduleFilePath, [opt] bool updatingNow) cil managed { .param [1] = "" .param [2] = "" .param [3] = bool(true) // 代码大小 216 (0xd8) .maxstack 4 .locals init ([0] bool V_0, [1] class [System]System.Diagnostics.FileVersionInfo fileVerInfo, [2] class AutoUpdater.Models.ClientUpdatingInfoModel model, [3] bool V_3) IL_0000: ldarg.0 由于[opt]是一个标识,我的理解是与C++里的宏定义无甚区别,仅为编译器使用,大致相当于#define [opt] 0x0010(https://stackoverflow.com/questions/5497514/what-does-opt-mean-in-msil)。实际上对具有默认值的参数的赋值发生在方法内部,即后面的“.param[1] = ""”等语句。 而App.Run()执行时,发现只有一个带有3个参数的构造函数,因此创建MainWindow对象失败了。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部