CSharp - 如何从一个构造函数调用另一个构造函数?

  显示原文与译文双语对照的内容

我有两个构造器,它们将值传递给只读字段。


class Sample
{
 public Sample(string theIntAsString)
 {
 int i = int.Parse(theIntAsString);

 _intField = i;
 }

 public Sample(int theInt)
 {
 _intField = theInt;
 }


 public int IntProperty
 {
 get { return _intField; }
 }
 private readonly int _intField;

}

一个构造函数直接接收值,另一个执行计算并获取值,然后设置字段。

下面是捕捉:

  1. 我不想复制设置代码。 在这种情况下,只设置了一个字段,但当然可能不止一个字段。
  2. 为了使字段成为只读,我需要将它们从构造函数中设置,所以我不能将共享代码添加到一个实用程序函数。
  3. 我不知道如何从另一个构造函数调用一个构造函数。

有什么想法吗?

时间:

如果你想要的东西不能在它自己的方法中进行初始化而得到令人满意的效果( 例如。 因为你想要在初始化代码之前做过多的事情,或者将它包装在一个try-finally中,或者任何一个构造函数都可以通过引用来传递只读变量,这样就可以使用它们了。


class Sample
{
 private readonly int _intField;
 public int IntProperty
 {
 get { return _intField; }
 }

 void setupStuff(ref int intField, int newValue)
 {
 intField = newValue;
 }

 public Sample(string theIntAsString)
 {
 int i = int.Parse(theIntAsString);
 setupStuff(ref _intField,i);
 }

 public Sample(int theInt)
 {
 setupStuff(ref _intField, theInt);
 }
}

在构造函数的主体之前,使用以下任一方法:


: base (parameters)

: this (parameters)

示例:-


public class People: User
{
 public People (int EmpID) : base (EmpID)
 {
//Add more statements here.
 }
}

我正在改进supercat的答案。 我猜以下也可以完成:


class Sample
{
 private readonly int _intField;
 public int IntProperty
 {
 get { return _intField; }
 }

 void setupStuff(ref int intField, int newValue)
 {
//Do some stuff here based upon the necessary initialized variables.
 intField = newValue;
 }

 public Sample(string theIntAsString, bool? doStuff = true)
 {
//Initialization of some necessary variables.
//==========================================
 int i = int.Parse(theIntAsString);
//................
//.......................
//==========================================

 if (!doStuff.HasValue || doStuff.Value == true)
 setupStuff(ref _intField,i);
 }

 public Sample(int theInt): this(theInt, false)//"false" param to avoid setupStuff() being called two times
 {
 setupStuff(ref _intField, theInt);
 }
}

下面是调用另一个构造函数的示例,然后检查它所设置的属性。


 public SomeClass(int i)
 {
 I = i;
 }

 public SomeClass(SomeOtherClass soc)
 : this(soc.J)
 {
 if (I==0)
 {
 I = DoSomethingHere();
 }
 }

当你从基类继承类时,你可以通过实例化派生类来调用基类构造函数


 class samle {
 public int x;
 public sample(int value){
 x = value;
 }
 }
 class der : public sample {
 public :
 int a;
 int b;
 public der(int value1,int value2):base(50){
 a = value1;
 b = value2;
 }
 class run{
 public static void main(String[] args){
 der obj = new der(10,20);
 Console.WriteLine(obj.x);
 Console.WriteLine(obj.a);
 Console.WriteLine(obj.b);
 }
 }

程序的输出是

50 10 20

你也可以使用这里关键字从另一个构造函数中调用构造函数


 class samle {
 public int x;
 public sample(int value){
 x = value;
 }
 public sample(sample obj):this(obj.x){
 }
 } 
 class run{
 public static void main(String[] args){
 sample s = new sample(20);
 sample ss = new sample(s);
 Console.WriteLine(ss.x);
 }
 } 

输出是 20

...