首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#成员变量初始化;最佳实践?

C#成员变量初始化;最佳实践?
EN

Stack Overflow用户
提问于 2008-11-18 08:51:02
回答 6查看 90.9K关注 0票数 102

在声明时初始化类成员变量更好吗

代码语言:javascript
运行
复制
private List<Thing> _things = new List<Thing>();
private int _arb = 99;

还是在默认构造函数中?

代码语言:javascript
运行
复制
private List<Thing> _things;
private int _arb;

public TheClass()
{
  _things = new List<Thing>();
  _arb = 99;
}

这是一个简单的风格问题,还是存在性能权衡,不管是哪种方式?

EN

回答 6

Stack Overflow用户

发布于 2008-11-18 09:12:23

实际上,正如您所演示的那样,字段初始化器是一个方便的简写。编译器实际上会将初始化代码复制到您为类型定义的每个实例构造函数的开头。

这有两个含义:第一,任何字段初始化代码在每个构造函数中都是重复的;第二,您在构造函数中包含的将字段初始化为特定值的任何代码实际上都会重新分配字段。

因此,就性能而言,考虑到编译后的代码大小,最好将字段初始化器移动到构造函数中。

另一方面,性能影响和代码“膨胀”通常是可以忽略的,字段初始化器语法具有重要的好处,可以减少您可能忘记初始化某个构造函数中的某个字段的风险。

票数 13
EN

Stack Overflow用户

发布于 2011-03-19 01:22:37

字段初始化器的一个主要限制是无法将它们包装在try-finally块中。如果在字段初始化器中抛出异常,则在以前的初始化器中分配的任何资源都将被放弃;没有办法阻止它。构造中的其他错误可以通过让受保护的基构造器通过引用接受IDisposable,并将其指向自身作为其第一个操作来处理。这样就可以避免调用构造函数,除非是通过工厂方法,在出现异常的情况下,工厂方法将在部分创建的对象上调用Dispose。如果主类构造函数在“走私”出对新对象的引用后失败,这种保护将允许清理在派生类初始值设定项中创建的IDisposables。不幸的是,如果字段初始值设定项失败,没有办法提供这样的保护。

票数 6
EN

Stack Overflow用户

发布于 2008-11-18 08:58:18

例如变量,这在很大程度上是一个风格问题(我更喜欢使用构造函数)。对于静态变量,有一个内联初始化的performance benefit (当然,并不总是可能的)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/298183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档