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
. Так как автоматические свойства устанавливают все переменные с типами классов в
null
, новый класс будет реализован с применением "традиционного" синтаксиса свойств:
using 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
, предназначенное для определения константных данных, которые после начальной установки больше никогда не могут быть изменены. Как нетрудно догадаться, оно полезно при определении набора известных значений для использования в приложениях, логически связанных с заданным классом или структурой.