remarks generate example c# constructor

c# - generate - Llama a un constructor de otro.



params comments c# (8)

Antes del cuerpo del constructor, use:

: base (parameters) : this (parameters)

Ejemplo:

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

Tengo dos constructores que alimentan valores a los campos de solo lectura.

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

Un constructor recibe los valores directamente, y el otro realiza algún cálculo y obtiene los valores, luego establece los campos.

Ahora aquí está la trampa:

  1. No quiero duplicar el código de configuración. En este caso, solo se establece un campo pero, por supuesto, puede haber más de uno.
  2. Para que los campos sean de solo lectura, debo establecerlos desde el constructor, por lo que no puedo "extraer" el código compartido a una función de utilidad.
  3. No sé cómo llamar a un constructor de otro.

¿Algunas ideas?


Aquí hay un ejemplo que llama a otro constructor, luego verifica la propiedad que ha establecido.

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


Cuando hereda una clase de una clase base, puede invocar el constructor de la clase base creando una instancia de la clase 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); } }

La salida del programa de ejemplo es

50 10 20

También puede usar this palabra clave para invocar un constructor de otro constructor

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

La salida de este programa de ejemplo es

20


Estoy mejorando la respuesta de Supercat. Supongo que también se puede hacer lo siguiente:

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


Me gusta esto:

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


Sí, puedes llamar a otro método antes de la base de llamadas o esto!

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


Si lo que desea no se puede lograr satisfactoriamente sin tener la inicialización en su propio método (por ejemplo, porque quiere hacer mucho antes del código de inicialización, o envuélvalo en un intento-finalmente, o lo que sea) puede tener cualquiera o todo los constructores pasan las variables de solo lectura por referencia a una rutina de inicialización, que luego podrá manipularlas a voluntad.

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


El encadenamiento del constructor, es decir, puede usar "Base" para Es una relación y "Este" puede usar para la misma clase, cuando desee llamar a varios Constructores en una sola llamada.

class BaseClass { public BaseClass():this(10) { } public BaseClass(int val) { } } class Program { static void Main(string[] args) { new BaseClass(); ReadLine(); } }