Chame um construtor de outro

Eu tenho dois construtores que alimentam valores para campos readonly.

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

Um construtor recebe os valores diretamente e o outro faz alguns cálculos e obtém os valores e, em seguida, define os campos.

Ora aqui está o truque:

  1. Eu não quero duplicar o código de configuração. Neste caso, apenas um campo é definido, mas é claro que pode haver mais de um.
  2. Para tornar os campos readonly, eu preciso configurá-los a partir do construtor, então não posso “extrair” o código compartilhado para uma function de utilitário.
  3. Eu não sei como chamar um construtor de outro.

Alguma ideia?

Como isso:

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

Se o que você quer não pode ser alcançado satisfatoriamente sem ter a boot em seu próprio método (por exemplo, porque você quer fazer muito antes do código de boot, ou envolvê-lo em um try-finally, ou qualquer outro) você pode ter qualquer ou todos construtores passam as variables ​​readonly por referência a uma rotina de boot, que será capaz de manipulá-las à vontade.

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

Antes do corpo do construtor, use:

 : base (parameters) : this (parameters) 

Exemplo:

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

Eu estou melhorando a resposta do supercat. Eu acho que o seguinte também pode ser feito:

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

Aqui está um exemplo que chama outro construtor e, em seguida, verifica a propriedade que ele definiu.

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

Sim, você pode chamar outro método antes da base de chamadas ou isso!

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

Quando você herda uma class de uma class base, você pode invocar o construtor da class base instanciando a class derivada

 class sample { public int x; public sample(int value) { x = value; } } class der : sample { public int a; public 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); System.Console.WriteLine(obj.x); System.Console.WriteLine(obj.a); System.Console.WriteLine(obj.b); } } 

A saída do programa de amostra é

50 10 20


Você também pode usar this palavra-chave para invocar um construtor de outro construtor

 class sample { 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); System.Console.WriteLine(ss.x); } } 

A saída deste programa de amostra é

20