Инициализация свойств в C#
Нашёл следующий пример в интернете, но не до конца понимаю как он работает:
class Credit
{
public virtual decimal Sum { get; set; }
}
class LongCredit : Credit
{
private decimal sum;
public override decimal Sum
{
get
{
return sum;
}
set
{
if (value > 1000)
{
sum = value;
}
}
}
}
class Program
{
static void Main(string[] args)
{
LongCredit credit = new LongCredit { Sum = 6000 };
credit.Sum = 490;
Console.WriteLine(credit.Sum);
Console.ReadKey();
}
}
Почему здесь используются фигурные скобки {} при создании экземпляра класса LongCredit? Насколько я понял, фигурные скобки используются при работе с методами, но здесь мы задаём значение поля Sum. Можно ли задать значение поля через обыкновенные скобки? new LongCredit(Sum = 6000);
Вопрос возник по отношению к этой строке:
LongCredit credit = new LongCredit { Sum = 6000 };
Ответы (2 шт):
An object initializer specifies values for zero or more fields, properties or indexed elements of an object.
antlr:object_initializer : '{' member_initializer_list? '}' | '{' member_initializer_list ',' '}' ;
С помощью инициализатора при создании объекта можно сразу задать значения для полей, свойств и индексированных элементов создаваемого объекта.
Пример:
using System;
using System.Collections.Generic;
class Test
{
public int Field;
public int Property { get; set; }
public Test Another;
}
class Program
{
private static void Main()
{
var p = new Test
{
//поле
Field = 1,
//свойство
Property = 2,
//создание нового объекта со своим инициализатором
Another = new Test{Field = 3}
};
var d = new Dictionary<string, string>
{
//установка элемента по индексу
["hello"] = "world"
};
Console.WriteLine($"{p.Field} {p.Property} {p.Another.Field}"); //1, 2, 3
Console.WriteLine(d["hello"]); //world
Console.Read();
}
}
Если говорит проще, то запись:
LongCredit credit = new LongCredit { Sum = 6000 };
эквивалентна следующей:
LongCredit credit = new LongCredit();
credit.Sum = 6000;
Через «обыкновенные скобки» задавать произвольные поля/свойства нельзя, т.к. через них вызывается конкретный конструктор с конкретными аргументами. Для того чтобы в него что-то передать нужно создать в конструкторе соответствующий аргумент.
Есть несколько способов инициализации объектов:
// Конструктор
var a = new Person("Иван", 26);
// Конструктор и установка ещё одного значения
// Вариант 1:
var a = new Person("Иван", 26);
a.Height = 190;
// Вариант 2:
var a = new Person("Иван", 26) { Height = 190 };
// Если нет конструктора, но нужно установить несколько значений:
// Вариант 1:
var a = new Person();
a.Name = "Иван";
a.Age = 26;
a.Height = 190;
//Вариант 2:
var a = new Person { Name = "Иван", Age = 26, Height = 190 }
Это просто более удобная инициализация (с полиморфизмом никак не связана)