Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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#basic_C#_Oop_Object_Properties_Constructor - Fatal编程技术网

实例化对象的差异-C#basic

实例化对象的差异-C#basic,c#,oop,object,properties,constructor,C#,Oop,Object,Properties,Constructor,我是面向对象编程的初学者,我有一个简单的问题。以下两者之间的区别是什么: public class Calculation { private _externalObject = new ExternalClass(); public int FirstParameter {get;set;} public int SecondParameter {get;set;} public int ThirdParameter {get;set;} p

我是面向对象编程的初学者,我有一个简单的问题。以下两者之间的区别是什么:

public class Calculation
{
     private _externalObject = new ExternalClass();

     public int FirstParameter {get;set;}
     public int SecondParameter {get;set;}
     public int ThirdParameter {get;set;}
     public int FourthParameter 
     {
          get
          {
               _externalObject.Calculate(FirstParameter, SecondParameter, ThirdParameter);
          }
     }
} 


我想学习如何编写最佳代码。

在这种特殊情况下,没有任何可测量的差异

但是,如果您有多个构造函数,如果您没有在字段声明中直接初始化字段,则必须在每个构造函数中初始化字段

这与其说是个人风格的问题,不如说是什么问题


关于类设计和集成的注意事项——如果您有这样一个外部依赖项,那么好的OOP将要求您使用DI(依赖项注入),而不是直接在类中实例化值。构造函数注入是一个不错的选择:

 private ExternalClass _externalObject;

 public Calculation(ExternalClass externalClass)
 {
       _externalObject = externalClass;
 }

以上允许在不改变实际类的情况下修改行为,并使类更易于测试。

在这种情况下,这两个类是相同的。事实上,对于几乎所有目的,您使用的两种代码样式都是相同的。通常,您会发现大多数样式指南都建议使用字段初始值设定项(尤其是静态字段初始值设定项)

有一个细微的区别,但它不太可能影响你

每当您内联初始化类成员时,C#会在运行构造函数中的任何代码之前生成代码来执行该初始化。特别是,如果构造函数调用基类构造函数。字段初始值设定项在调用基类构造函数之前运行,而用户提供的构造函数中的代码必须在调用之后运行。也就是说,以下两类略有不同:

public class B : A
{
  // This happens *before* the base-class constructor.
  public ExternalObject external = new ExternalObject();

  public B () : base() { }
}

public class C : A
{
  public ExternalObject external;
  public C () : base()
  {
    // This happens *after* the base-class constructor.
    this.external = new ExternalObject();
  }
}
请注意,如果不提供默认构造函数,C会自动为您提供一个调用
base()
的构造函数,使您的类“看起来像”class
B
即使您没有明确提供
B()
构造函数


在实践中,这种差异不太重要。您不能在字段初始值设定项中实际引用
这个
,因此在这两种情况下都不能依赖正在构造的基类。

好问题,欢迎使用!另外,请不要忘记接受并回答下面提供给您的Oded。简单地说,在这种情况下没有区别。如果您要进行辅导,不妨将其作为一个界面:)@bas-Meh。接口使用过度。谢谢你的回答。
public class B : A
{
  // This happens *before* the base-class constructor.
  public ExternalObject external = new ExternalObject();

  public B () : base() { }
}

public class C : A
{
  public ExternalObject external;
  public C () : base()
  {
    // This happens *after* the base-class constructor.
    this.external = new ExternalObject();
  }
}