当前位置: 首页 > 编程语言 > C#

如果初始化器抛出异常,是否构造了一个对象?分享

时间:2023-04-11 01:32:17 C#

如果初始化器抛出,是否构造了一个对象?我在JagReeghal的博客上阅读了这篇文章。在我看来,他的建议实际上与使用对象初始值设定项不同。然后我意识到我真的不知道。当构造一个对象时,使用对象初始值设定项,并且其中一个初始值设定项抛出(可能是NullReferenceException)......实际构造的是什么对象?这基本上就像构造函数中抛出的异常吗?或者对象是完全构建然后初始化的?对象初始化语句,如varx=newFoo{Property1=5};将按如下方式实现:Footemp=newFoo();temp.Property1=5;x=温度;可以看到,初始化器中的属性是在构造对象之后设置的,但是在所有属性设置之前,变量并没有设置为完全初始化的对象,所以如果抛出异常,构造的对象甚至会丢失如果捕获到异常(变量将保持为null或任何值)。它首先被完全构建,然后被初始化。但是,如果抛出异常,您将永远不会获得对此类对象的引用,编译器将确保您的引用只能引用正确初始化的对象。它使用temporary来保证这一点。例如,这段代码:varobj=newModel{FirstName=reader[0].ToString(),LastName=reader[1].ToString(),Age=Convert.ToInt32(reader[2].ToString())};由编译器重写为:vartemp=newModel();temp.FirstName=reader[0].ToString();temp.LastName=读者[1].ToString();temp.Age=Convert.ToInt32(reader[2].ToString())varobj=temp;将构造对象,但初始化将无法完成。初始化只是一个编译技巧;查看生成的IL,您会以相同的方式看到它。博客文章抱怨说很难判断异常发生在哪一行,但我个人从来没有这么难过。你们都需要知道编译的IL并不总是相同的!!不同之处在于调试/发布构建配置。不信你看看反射器……以上是C#学习教程:如果初始化器抛出,是不是构造了一个对象?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: