C # Clase constructor valor predeterminado pregunta

Tengo la siguiente clase:

public class Topic { public string Topic { get; set; } public string Description { get; set; } public int Count { get; set; } } 

Me gustaría tener el conteo siempre establecido en cero cuando la clase se crea con lo siguiente:

 var abc = new Topic { Topic = "test1", Description = "description1" } 

Estoy un poco confundido con el constructor. ¿Es esto posible o debo especificar Tema, Descripción y Recuento cuando creo abc?

Tienes algunas opciones diferentes.

1) int defecto es cero, por lo que será cero si no lo inicializa.

2) puedes usar un constructor

 public Topic(){ Count = 0;} 

3) Puede usar un campo de respaldo en lugar de propiedad automática e inicializarlo a cero

  private int _count = 0; public int Count { get {return _count} set {_count = value; } } 

El valor predeterminado de un int es 0.

Todos los tipos de valor tienen valores predeterminados, ya que no pueden ser null .

Consulte Inicializar tipos de valor en esta página de MSDN.

Count será 0 en la inicialización, ya que es un tipo de valor y no puede ser null .

Este siguiente modismo no es solo un constructor:

 var abc = new Topic { Topic = "test1", Description = "description1" } 

Es un constructor y un inicializador de objetos.

Lo que realmente sucede es que el new Topic() se llama primero, por lo tanto, se inicializan todos los valores a sus valores predeterminados (el tema de la propiedad es nulo, la descripción es nula y el recuento es 0). Después de eso, el valor “test1” se asigna al tema, y ​​el valor “description1” se asigna a la descripción.

Todos los tipos de valor tienen un valor predeterminado diferente a nulo (ya que no pueden ser nulos), y los tipos de referencia predeterminados son nulos.

Progtwig público de clase {public static void Main () {

  // Declare a StudentName by using the constructor that has two parameters. StudentName student1 = new StudentName("Craig", "Playstead"); // Make the same declaration by using a collection initializer and sending // arguments for the first and last names. The default constructor is // invoked in processing this declaration, not the constructor that has // two parameters. StudentName student2 = new StudentName { FirstName = "Craig", LastName = "Playstead", }; // Declare a StudentName by using a collection initializer and sending // an argument for only the ID property. No corresponding constructor is // necessary. Only the default constructor is used to process object // initializers. StudentName student3 = new StudentName { ID = 183 }; // Declare a StudentName by using a collection initializer and sending // arguments for all three properties. No corresponding constructor is // defined in the class. StudentName student4 = new StudentName { FirstName = "Craig", LastName = "Playstead", ID = 116 }; System.Console.WriteLine(student1.ToString()); System.Console.WriteLine(student2.ToString()); System.Console.WriteLine(student3.ToString()); System.Console.WriteLine(student4.ToString()); } // Output: // Craig 0 // Craig 0 // 183 // Craig 116 

}

clase pública StudentName {

 // The default constructor has no parameters. The default constructor // is invoked in the processing of object initializers. // You can test this by changing the access modifier from public to // private. The declarations in Main that use object initializers will // fail. public StudentName() { } // The following constructor has parameters for two of the three // properties. public StudentName(string first, string last) { FirstName = first; LastName = last; } // Properties. public string FirstName { get; set; } public string LastName { get; set; } public int ID { get; set; } public override string ToString() { return FirstName + " " + ID; } 

}

EDITAR

Como aprendí de los comentarios a esta respuesta, es perfectamente válido omitir el () en la llamada inicializadora.

La syntax correcta sería Mi syntax preferida aún es:

 var abc = new Topic() { Topic = "test1", Description = "description1" } 

(tenga en cuenta el () ).

Esto iniciaría el Count a 0, ya que 0 es el valor predeterminado para int . En caso de que desee especificar siempre el Tema y la Descripción, agregue un constructor explícito:

 public Topic(string topic, string description) { Topic = topic; Description = description; // You may also set Count explicitly here, but if you want "0" you don't need to }