Вопрос по умолчанию класса конструктора класса С#
У меня есть следующий класс:
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;
}
}