Вопрос по умолчанию класса конструктора класса С#

У меня есть следующий класс:

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

Я хотел бы, чтобы граф всегда устанавливался в ноль, когда класс создается со следующим:

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

Я немного запутался с конструктором. Возможно ли это или мне нужно указать тему, описание и число, когда я создаю abc?

Ответ 1

У вас есть несколько разных вариантов.

1) int по умолчанию равно нулю, поэтому он будет равен нулю, если вы не инициализируете его.

2) вы можете использовать конструктор

public Topic(){ Count = 0;}

3) Вместо автоматического свойства вы можете использовать фоновое поле и инициализировать нулевое значение

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

Ответ 2

Значение по умолчанию int равно 0.

Все типы значений имеют значения по умолчанию, поскольку они не могут быть null.

См. Инициализация типов значений на этой странице MSDN.

Ответ 3

Count по умолчанию будет 0 при инициализации, так как это тип значения и не может быть null.

Ответ 4

Эта следующая идиома - это не только конструктор:

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

Это конструктор и инициализатор объекта.

В действительности происходит то, что new Topic() вызывается первым, поэтому инициализируется все значения по умолчанию (свойство Topic равно null, Description - null, а Count - 0). После этого значение "test1" назначается теме, а значению "description1" присваивается описание.

Все типы значений имеют значение по умолчанию, отличное от нуля (поскольку они не могут быть нулевыми), а ссылочные типы по умолчанию равны нулю.

Ответ 5

EDIT

Как я узнал из комментариев к этому ответу, вполне допустимо оставить () в вызове инициализации.

Правильный синтаксис будет. Мой предпочтительный синтаксис:

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

(обратите внимание на ()).

Это инициализировало бы Count на 0, так как значение 0 по умолчанию для int. Если вы хотите всегда указывать тему и описание, добавьте явный конструктор:

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
}

Ответ 6

программа общественного класса {   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

}

открытый класс 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;
}

}