Допускается также проектировать структуры со Point
следующим образом:
struct Point
{
// Поля структуры.
public int X;
public int Y;
// Специальный конструктор.
public Point(int xPos, int yPos)
{
X = xPos;
Y = yPos;
}
...
}
Затем переменные типа Point
можно создавать так:
// Вызвать специальный конструктор.
Point p2 = new Point(50, 60);
// Выводит X=50,Y=60.
p2.Display;
Использование структур, допускающих только чтение (нововведение в версии 7.2)
Структуры можно также помечать как допускающие только чтение, если необходимо, чтобы они были
readonly struct ReadOnlyPoint
{
// Fields of the structure.
public int X {get; }
public int Y { get; }
// Display the current position and name.
public void Display
{
Console.WriteLine($"X = {X}, Y = {Y}");
}
public ReadOnlyPoint(int xPos, int yPos)
{
X = xPos;
Y = yPos;
}
}
Методы Increment
и Decrement
были удалены, т.к. переменные допускают только чтение. Обратите внимание на свойства X
и Y
. Вместо определения их в виде полей они создаются как автоматические свойства, доступные только для чтения. Автоматические свойства рассматриваются в главе 5.
Использование членов, допускающих только чтение (нововведение в версии 8.0)
В версии C# 8.0 появилась возможность объявления индивидуальных полей структуры как readonly
. Это обеспечивает более высокий уровень детализации, чем объявление целой структуры как допускающей только чтение. Модификатор readonly
может применяться к методам, свойствам и средствам доступа для свойств. Добавьте следующий код структуры в свой файл за пределами класса Program
:
struct PointWithReadOnly
{
// Поля структуры.
public int X;
public readonly int Y;
public readonly string Name;
// Отобразить текущую позицию и название.
public readonly void Display
{
Console.WriteLine($"X = {X}, Y = {Y}, Name = {Name}");
}
// Специальный конструктор.
public PointWithReadOnly(int xPos, int yPos, string name)
{
X = xPos;
Y = yPos;
Name = name;
}
}
Для использования этой новой структуры добавьте к операторам верхнего уровня такой код:
PointWithReadOnly p3 =
new PointWithReadOnly(50,60,"Point w/RO");
p3.Display;
Использование структур ref (нововведение в версии 7.2)
При определении структуры в C# 7.2 также появилась возможность применения модификатора ref
. Он требует, чтобы все экземпляры структуры находились в стеке и не могли присваиваться свойству другого класса. Формальная причина для этого заключается в том, что ссылки на структуры ref
из кучи невозможны. Отличие между стеком и кучей объясняется в следующем разделе.
Ниже перечислены дополнительные ограничения структур ref
:
• их нельзя присваивать переменной типа object
или dynamic
, и они не могут быть интерфейсного типа;
• они не могут реализовывать интерфейсы;
• они не могут использоваться в качестве свойства структуры, не являющейся ref
;
• они не могут применяться в асинхронных методах, итераторах, лямбда-выражениях или локальных функциях.
Показанный далее код, в котором создается простая структура и затем предпринимается попытка создать в этой структуре свойство, типизированное как структура ref
, не скомпилируется;
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT