Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#在类构造函数中指定类属性有什么好处吗?_C#_Oop_Constructor - Fatal编程技术网

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

C#在类构造函数中指定类属性有什么好处吗?,c#,oop,constructor,C#,Oop,Constructor,例如,如果我有这样一个类: namespace Sample { public Class TestObject { private Object MyAwesomeObject = new MyAwesomeObject(); } } 将其设置为在构造函数中这样设置属性有什么好处吗 namespace Sample { public Class TestObject { private Object M

例如,如果我有这样一个类:

namespace Sample
{
     public Class TestObject
     {
          private Object MyAwesomeObject = new MyAwesomeObject();
     }
}
将其设置为在构造函数中这样设置属性有什么好处吗

namespace Sample
{
     public Class TestObject
     {
          private Object MyAwesomeObject;

          public TestObject()
          {
                MyAwesomeObject = new MyAwesomeObject()
          }
     }
}
这两者(几乎)相同

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

private Object MyAwesomeObject = new MyAwesomeObject(); 
这将发生在类构造函数代码之前。这通常更好,但也有一些限制

通过在构造函数中设置它,可以使用构造函数参数初始化成员。通常,这是必要的,以获得更多的信息到您的类成员


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

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

  • 它使逐步调试变得更容易

  • 这样可以更容易地控制调用构造函数的顺序

  • 它可以根据某些逻辑或传入的参数将参数发送给构造函数,或发送给正在处理的对象

  • 字段会立即初始化 在对象的构造函数之前 实例被调用。如果构造函数 指定一个字段的值,它将 覆盖字段中给定的任何值 声明


    请参见。

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

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

    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;
                  }
              }
         }
    }
    

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

    我喜欢在类构造函数中保留任何类属性的所有初始化,无论是原语还是对象。使代码更易于阅读。更容易调试。另外,构造函数的目的是初始化类属性


    另外,对于根据类开发的客户机,最好确保所有属性都获得默认值,并创建所有对象。当客户端使用您的类时,避免NullReferenceException。对我来说,将这些都放在构造函数中可以更容易地管理

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

    在声明站点初始化东西的另一个好特性是,在只读字段上这样做可以保证字段在其默认(初始化为零)状态下是不可见的

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


    我认为,如果某个东西需要文件中的信息,那么应该从外部传递到该文件中,或者通过某种形式的初始化来完成。我试图使构造函数尽可能简单和快速。什么是静态上下文?在静态上下文中,您没有弄错吗?有时(特别是对于表达式树),您需要在静态上下文(不与特定实例关联)中执行“类”级别的操作。这里有一个例子:在这种情况下,您不能内联初始化ChangeNotifier实例,因为“()=>Property”表达式实际上没有绑定到该类实例-它是静态的(在静态上下文中)。如果您使用Alan的代码,并尝试内联初始化ChangeNotifier实例,您会发现编译器会抱怨一个错误,如:“无法在静态上下文中访问非静态属性”。我的意思是,您在内联成员初始值设定项中处于静态上下文中,而不是在构造函数中,正如您在回答中所述。也许只是我误解了你的英语。我确实发现最后一段有点让人困惑…+1因为没有重复代码。请注意,如果您希望在构造函数中包含代码,另一种方法是在一个构造函数(通常是默认构造函数)中初始化这些成员,然后从所有其他构造函数调用该构造函数,所以初始化代码仍然是共享的。当需要一些逻辑来设置类时,我经常使用这种方法。其中只有一个构造函数接受多个参数,任何其他构造函数都使用默认值调用它。