Язык программирования C#9 и платформа .NET5
Часть 212 из 642 Информация о книге
// Обобщенные свойства.public T X{get => _xPos;set => _xPos = value;}public T Y{get => _yPos;set => _yPos = value;}public override string ToString() => $"[{_xPos}, {_yPos}]";}}Как видите, структура
задействует параметр типа в определениях полей данных, в аргументах конструктора и в определениях свойств.Point<T>Выражения default вида значений в обобщениях
С появлением обобщений ключевое слово
получило двойную идентичность. Вдобавок к использованию внутри конструкцииdefaultоно также может применяться для установки параметра типа в стандартное значение. Это очень удобно, т.к. действительные типы, подставляемые вместо заполнителей, обобщенному типу заранее не известны, а потому он не может безопасно предполагать, какими будут стандартные значения. Параметры типа подчиняются следующим правилам:switch• числовые типы имеют стандартное значение
;0• ссылочные типы имеют стандартное значение
;null• поля структур устанавливаются в
(для типов значений) или в0(для ссылочных типов).nullЧтобы сбросить экземпляр
в начальное состояние, значенияPoint<T>иXможно было бы установить вYнапрямую. Это предполагает, что вызывающий код будет предоставлять только числовые данные. А как насчет версии0? Именно здесь пригодится синтаксисstring. Ключевое словоdefault(Т)сбрасывает переменную в стандартное значение для ее типа данных. Добавьте метод по имениdefault:ResetPoint()// Сбросить поля в стандартное значение параметра типа.// Ключевое слово default в языке C# перегружено.// При использовании с обобщениями оно представляет// стандартное значение параметра типа.public void ResetPoint(){_xPos = default(T);_yPos = default(T);}Теперь, располагая методом
, вы можете в полной мере использовать методы структурыResetPoint().Point<T>using System;using GenericPoint;Console.WriteLine("***** Fun with Generic Structures *****\n");// Точка с координатами типа int.Point<int> p = new Point<int>(10, 10);Console.WriteLine("p.ToString()={0}", p.ToString());p.ResetPoint();Console.WriteLine("p.ToString()={0}", p.ToString());Console.WriteLine();// Точка с координатами типа double.Point<double> p2 = new Point<double>(5.4, 3.3);Console.WriteLine("p2.ToString()={0}", p2.ToString());p2.ResetPoint();Console.WriteLine("p2.ToString()={0}", p2.ToString());Console.WriteLine();// Точка с координатами типа string.Point<string> p3 = new Point<string>("i", "3i");Console.WriteLine("p3.ToString()={0}", p3.ToString());p3.ResetPoint();Console.WriteLine("p3.ToString()={0}", p3.ToString());Console.ReadLine();Ниже приведен вывод:
***** Fun with Generic Structures *****p.ToString()=[10, 10]p.ToString()=[0, 0]p2.ToString()=[5.4, 3.3]p2.ToString()=[0, 0]p3.ToString()=[i, 3i]p3.ToString()=[, ]Выражения default литерального вида (нововведение в версии 7.1)
В дополнение к установке стандартного значения свойства в версии C# 7.1 появились выражения
литерального вида, которые устраняют необходимость в указании типа переменной вdefault. Модифицируйте методdefaultкак показано ниже:ResetPoint(),public void ResetPoint(){_xPos = default;_yPos = default;}Выражение
не ограничивается простыми переменными и может также применяться к сложным типам. Например, вот как можно создать и инициализировать структуруdefault:PointPoint<string> p4 = default;Console.WriteLine("p4.ToString()={0}", p4.ToString());