Язык программирования C#9 и платформа .NET5
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;}public Point() : this(PointColorEnum.BloodRed){ }public void DisplayStats(){Console.WriteLine("[{0}, {1}]", X, Y);Console.WriteLine("Point is {0}", Color);}}Посредством нового конструктора теперь можно создавать точку золотистого цвета (в позиции (90, 20)):
// Вызов более интересного специального конструктора// с помощью синтаксиса инициализации.Point goldPoint = new Point(PointColorEnum.Gold){ X = 90, Y = 20 };goldPoint.DisplayStats();Инициализация данных с помощью синтаксиса инициализации
Как кратко упоминалось ранее в главе (и будет подробно обсуждаться в главе 6), отношение "имеет" позволяет формировать новые классы, определяя переменные-члены существующих классов. Например, пусть определен класс
, в котором для представления координат верхнего левого и нижнего правого углов используется типRectangle. Так как автоматические свойства устанавливают все переменные с типами классов вPoint, новый класс будет реализован с применением "традиционного" синтаксиса свойств:nullusing System;namespace ObjectInitializers{class Rectangle{private Point topLeft = new Point();private Point bottomRight = new Point();public Point TopLeft{get { return topLeft; }set { topLeft = value; }}public Point BottomRight{get { return bottomRight; }set { bottomRight = value; }}public void DisplayStats(){Console.WriteLine("[TopLeft: {0}, {1}, {2} BottomRight: {3},{4}, {5}]",topLeft.X, topLeft.Y, topLeft.Color,bottomRight.X, bottomRight.Y, bottomRight.Color);}}}С помощью синтаксиса инициализации объектов можно было бы создать новую переменную
и установить внутренние объектыRectangleследующим образом:Point// Создать и инициализировать объект Rectangle.Rectangle myRect = new Rectangle{TopLeft = new Point { X = 10, Y = 10 },BottomRight = new Point { X = 200, Y = 200}};Преимущество синтаксиса инициализации объектов в том, что он по существу сокращает объем вводимого кода (предполагая отсутствие подходящего конструктора). Вот как выглядит традиционный подход к созданию похожего экземпляра
:Rectangle// Традиционный подход.Rectangle r = new Rectangle();Point p1 = new Point();p1.X = 10;p1.Y = 10;r.TopLeft = p1;Point p2 = new Point();p2.X = 200;p2.Y = 200;r.BottomRight = p2;Поначалу синтаксис инициализации объектов может показаться несколько непривычным, но как только вы освоитесь с кодом, то будете приятно поражены тем, насколько быстро и с минимальными усилиями можно устанавливать состояние нового объекта.
Работа с константными полями данных и полями данных, допускающими только чтение
Иногда требуется свойство, которое вы вообще не хотите изменять либо с момента компиляции, либо с момента его установки во время конструирования, также известное как неизменяемое. Один пример уже был исследован ранее — средства доступа только для инициализации. А теперь мы займемся константными полями и полями, допускающими только чтение.
Понятие константных полей данных
Язык C# предлагает ключевое слово
, предназначенное для определения константных данных, которые после начальной установки больше никогда не могут быть изменены. Как нетрудно догадаться, оно полезно при определении набора известных значений для использования в приложениях, логически связанных с заданным классом или структурой.const