从另一个调用一个构造函数

我有两个构造函数将值提供给只读字段。

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. 我不知道如何从另一个构造函数中调用。

有任何想法吗?

喜欢这个:

 public Sample(string str) : this(int.Parse(str)) { } 

如果你不想在自己的方法中进行初始化(例如,因为你想在初始化代码之前做太多的事情,或者试着把它包装起来,或者其他任何东西),你不能满意地实现,你可以有任何或所有的构造函数通过引用初始化例程来传递只读variables,然后可以随意操作它们。

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

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

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

该scheme的输出是

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。

是的,你可以在呼叫基地或这个之前打电话给其他方法!

 public class MyException : Exception { public MyException(int number) : base(ConvertToString(number)) { } private static string ConvertToString(int number) { return number.toString() } }