Книга: C# 4.0: полное руководство
Получение значения, присваиваемого параметру типа по умолчанию
Получение значения, присваиваемого параметру типа по умолчанию
Как упоминалось выше, при написании обобщенного кода иногда важно провести различие между типами значений и ссылочными типами. Такая потребность возникает, в частности, в том случае, если переменной параметра типа должно быть присвоено значение по умолчанию. Для ссылочных типов значением по умолчанию является null
, для неструктурных типов значений — 0 или логическое значение false
, если это тип bool
, а для структур типа struct
— объект соответствующей структуры с полями, установленными по умолчанию. В этой связи возникает вопрос: какое значение следует присваивать по умолчанию переменной параметра типа: null
, 0 или нечто другое? Например, если в следующем объявлении класса Test
:
class Test<T> {
Т obj;
// ...
переменной obj требуется присвоить значение по умолчанию, то какой из двух вариантов
obj = null; // подходит только для ссылочных типов или
obj =0; // подходит только для числовых типов и
// перечислений, но не для структур
следует выбрать? Для разрешения этой дилеммы можно воспользоваться еще одной формой оператора default
, приведенной ниже.
default(тип)
Эта форма оператора default
пригодна для всех аргументов типа, будь то типы значений или ссылочные типы.
Ниже приведен короткий пример, демонстрирующий данную форму оператора
default
.
// Продемонстрировать форму оператора default.
using System;
class MyClass {
//...
}
// Получить значение, присваиваемое параметру типа Т по умолчанию,
class Test<T> {
public T obj;
public Test() {
// Следующий оператор годится только для ссылочных типов.
// obj = null; //не годится
// Следующий оператор годится только для типов значений.
// obj = 0; // не годится
// А этот оператор годится как для ссылочных типов,
// так и для типов значений,
obj = default(T); // Годится!
}
// ...
}
class DefaultDemo {
static void Main() {
// Сконструировать объект класса Test, используя ссылочный тип.
Test<MyClass> x = new Test<MyClass>();
if (x.obj == null)
Console.WriteLine("Переменная x.obj имеет пустое значение <null>.");
// Сконструировать объект класса Test, используя тип значения.
Test<int> у = new Test<int>();
if (у.obj == 0)
Console.WriteLine("Переменная у.obj имеет значение 0.");
}
}
Вот к какому результату приводит выполнение этого кода.
Переменная x.obj имеет пустое значение <null>.
Переменная у.obj имеет значение 0.
- Что такое обобщения
- Простой пример обобщений
- Обобщенный класс с двумя параметрами типа
- Общая форма обобщенного класса
- Получение значения, присваиваемого параметру типа по умолчанию
- Обобщенные структуры
- Создание обобщенного метода
- Обобщенные делегаты
- Обобщенные интерфейсы
- Сравнение экземпляров параметра типа
- Иерархии обобщенных классов
- Переопределение виртуальных методов в обобщенном классе
- Перегрузка методов с несколькими параметрами типа
- Ковариантность и контравариантность в параметрах обобщенного типа
- Создание экземпляров объектов обобщенных типов
- Некоторые ограничения, присущие обобщениям
- Заключительные соображения относительно обобщений
- Значения по умолчанию
- Получение статистики
- Ответный файл, используемый по умолчанию (csc.rsp)
- Выражения в значениях по умолчанию для доменов
- Значения переменных по умолчанию
- Использование CAST() с типами дата
- 1. Пустые значения (Empty-значения)
- 2. Неопределенные значения (Null-значения)
- 3. Null-значения и общее правило вычисления выражений
- 4. Null-значения и логические операции
- 5. Null-значения и проверка условий
- 3. Схемы отношений. Именованные значения кортежей