C#在类构造函数中分配类属性有什么好处吗?

时间:2010-01-04 20:24:54

标签: c# oop constructor

例如,如果我有这样的课程:

namespace Sample
{
     public Class TestObject
     {
          private Object MyAwesomeObject = new MyAwesomeObject();
     }
}

设置它是否有任何好处,以便像这样在构造函数中设置属性?

namespace Sample
{
     public Class TestObject
     {
          private Object MyAwesomeObject;

          public TestObject()
          {
                MyAwesomeObject = new MyAwesomeObject()
          }
     }
}

9 个答案:

答案 0 :(得分:10)

两者(几乎)相同。

在内联时定义初始值设定项:

private Object MyAwesomeObject = new MyAwesomeObject(); 

这将在类构造函数代码之前发生。这通常更好,但确实有一些限制。

在构造函数中进行设置可让您使用构造函数参数初始化您的成员。通常,这是为了向您的班级成员提供更多信息所必需的。

此外,在构造函数中设置值时,可以在静态上下文中使用类数据,这与内联方法无关。例如,如果要使用表达式树初始化某些内容,则通常需要在构造函数中,因为表达式树位于静态上下文中,不允许在内联成员初始值设定项中访问类成员。 / p>

答案 1 :(得分:4)

  1. 这样可以更轻松地进行一步一步的调试

  2. 可以更轻松地控制调用构造函数的顺序

  3. 它可以根据某些逻辑将参数发送给构造函数,或者将参数传递给您正在处理的对象。

答案 2 :(得分:2)

在声明站点初始化内容的另一个不错的属性是,在readonly字段上执行此操作可确保该字段在其默认(初始化为零)状态下不可观察。

这是我关于这个主题的文章:

http://blogs.msdn.com/ericlippert/archive/2008/02/18/why-do-initializers-run-in-the-opposite-order-as-constructors-part-two.aspx

答案 3 :(得分:1)

唯一的好处是你可以在构造函数中更加动态,其中内联初始化要求你只对构造函数参数使用静态值等。例如,如果MyAwesomeObject需要配置文件中的值,则必须在构造函数中设置该值

答案 4 :(得分:1)

  

字段立即初始化   在对象的构造函数之前   实例被调用。如果是构造函数   分配一个字段的值,它会   覆盖字段期间给出的任何值   声明。

请参阅Fields (C# Programming Guide)

答案 5 :(得分:1)

在您的特定示例中,没有任何优势。

然而,存在惰性实例化,在许多情况下会减少内存占用:

namespace Sample
{
     public Class TestObject
     {
          private Object m_MyAwesomeObject;

          public TestObject()
          {

          }

          public Object MyAwesomeObject
          {
              get
              {
                  if (m_MyAwesomeObject == null)
                      m_MyAwesomeObject = new Object();

                  return m_MyAwesomeObject;
              }
          }
     }
}

答案 6 :(得分:1)

我喜欢为类构造函数中的任何类属性(原始对象或对象)保留所有初始化。使代码更易于阅读。更容易调试。此外,构造函数的目的是初始化类属性。

对于针对您的类开发的客户,最好确保所有属性都获得默认值并创建所有对象。当客户端使用您的类时,避免NullReferenceExceptions。对我来说,把这一切都放在构造函数中会使管理变得更容易。

答案 7 :(得分:1)

我不喜欢复制代码,即使它是(希望)少数构造函数之一。为此,我倾向于在任何有意义的地方进行内联初始化。

答案 8 :(得分:0)

通常,需要非默认构造函数可确保实例处于默认状态以外的其他状态。这也允许不可变类,它们各有优势。