В версии C# 9.0 появилось новое средство доступа только для инициализации. Оно позволяет устанавливать свойство во время инициализации, но после завершения конструирования объекта свойство становится доступным только для чтения. Свойства такого типа называются
ReadOnlyPointAfterCreation.cs и поместите в него следующий код:using System;
namespace ObjectInitializers
{
class PointReadOnlyAfterCreation
{
public int X { get; init; }
public int Y { get; init; }
public void DisplayStats
{
Console.WriteLine("InitOnlySetter: [{0}, {1}]", X, Y);
}
public PointReadOnlyAfterCreation(int xVal, int yVal)
{
X = xVal;
Y = yVal;
}
public PointReadOnlyAfterCreation { }
}
}
Новый класс тестируется с применением приведенного ниже кода:
// Создать объект точки, допускающий только чтение
// после конструирования
PointReadOnlyAfterCreation firstReadonlyPoint =
new PointReadOnlyAfterCreation(20, 20);
firstReadonlyPoint.DisplayStats;
// Или создать объект точки с использованием синтаксиса только
// для инициализации.
PointReadOnlyAfterCreation secondReadonlyPoint =
new PointReadOnlyAfterCreation { X = 30, Y
= 30 };secondReadonlyPoint.DisplayStats;
Обратите внимание, что в коде для класса Point
X и Y нельзя. Например, показанный далее код не скомпилируется:// Следующие две строки не скомпилируются
secondReadonlyPoint.X = 10;
secondReadonlyPoint.Y = 10;
Вызов специальных конструкторов с помощью синтаксиса инициализации
В предшествующих примерах объекты типа Point
// Здесь стандартный конструктор вызывается неявно.
Point finalPoint = new Point { X = 30, Y = 30 };
При желании стандартный конструктор допускается вызывать и явно:
// Здесь стандартный конструктор вызывается явно.
Point finalPoint = new Point { X = 30, Y = 30 };
Имейте в виду, что при конструировании объекта типа с использованием синтаксиса инициализации можно вызывать любой конструктор, определенный в классе. В настоящий момент в типе Point
Point приведет к установке X в 100 и Y в 100 независимо от того факта, что в аргументах конструктора указаны значения 10 и 16:// Вызов специального конструктора.
Point pt = new Point(10, 16) { X = 100, Y = 100 };
Имея текущее определение типа Point
Point предоставляет новый конструктор, который позволяет вызывающему коду устанавливать цвет (через специальное перечисление PointColor), тогда комбинация специальных конструкторов и синтаксиса инициализации объектов становится ясной.Добавьте к проекту новый файл класса по имени PointColorEnum.cs
namespace ObjectInitializers
{
enum PointColorEnum
{
LightBlue,
BloodRed,
Gold
}
}
Обновите код класса Point
class Point
{
public int X { get; set; }
public int Y { get; set; }
public PointColorEnum Color{ get; set; }
public Point(int xVal, int yVal)
{
X = xVal;
Y = yVal;
Color = PointColorEnum.Gold;
}
public Point(PointColorEnum ptColor)
{
Color = ptColor;
}
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT