Каков целочисленный ссылочный тип в С#?
Я хотел бы иметь целочисленную переменную, которая может быть установлена в нуль и не хочет использовать синтаксис int? myVariable
. Я пробовал использовать int
и Int16
безрезультатно. Должен ли я использовать int? myVariable
?
Я упомянул об этом, потому что в Java есть как тип "int" (примитив), так и "Integer" (ссылочный тип). Я хотел быть уверенным, что не существует встроенного целочисленного ссылочного типа, который я мог бы использовать. Я буду использовать 'int?' за то, что я делаю.
Ответы
Ответ 1
Для информации int?
/Nullable<T>
используется не ссылочный тип; это просто "нулевой тип", означающий: struct (по существу и int
и флаг bool
) со специальными правилами компилятора (re null check, операторами и т.д.) и правилами CLI (для бокса/распаковки). В .NET нет "целочисленного ссылочного типа", если вы не считаете бокс:
int i = 123;
object o = i; // box
но это создает ненужный объект и имеет множество связанных с ним других проблем.
Для чего вы хотите, int?
должен быть идеальным. Вы можете использовать длинный синтаксис (Nullable<int>
), но IMO это излишне подробный, и я видел, как это путают людей.
Ответ 2
Да, вы должны использовать типы с нулевым значением
См. Nullable
Nullable<int> Nullable<float>
или просто
int? float?
PS:
Если вы не хотите использовать обозначения ? или Nullable вообще - просто используйте специальные структуры для такой вещи. Например DataTable:
var table = new DataTable();
table.Columns.Add('intCol',typeof(int));
var row = table.NewRow();
row['intCol'] = null; //
Ответ 3
Нулевыми типами являются экземпляры структуры System.Nullable(T).
Следовательно, int, int?, Nullable <int> все типы значение, а не ссылочные типы
Ответ 4
Да, это единственный способ, поскольку Int32/Int16/int является примитивным типом (независимо от бокса/распаковки из них).
Ответ 5
Синтаксис <var>?
делает его нулевым. Если вы копаете немного глубже, вы увидите его только универсальный объект, который будет использоваться.
Если вы хотите сделать это как С++, вы должны использовать небезопасные операции. Затем доступны указатели типа C, но ваш код не соответствует CLR...
Для использования чистого .NET без указателей, путь ?
- это путь.
Ответ 6
Да. Вот почему Microsoft добавила это. Люди создавали свой собственный класс Nullable, поэтому они включали этот шаблон в .NET.
Ответ 7
Вы можете использовать System.Nullable<int>
, если вы так сильно ненавидите ?
.
Ответ 8
Вам придется использовать тип с нулевым значением, например:
Nullable<int> or int?
Цель типа nullable - включить, чтобы присвоить значение null типу значения.
Из MSDN:
Nullable types адресуйте сценарий, в котором вы хотите иметь примитивный тип с нулевым (или неизвестным) значением. Это распространено в сценариях базы данных, но также полезно в других ситуациях.
В прошлом было несколько способов сделать это:
- Тип в штучной упаковке. Это не является строго типизированным во время компиляции и предполагает выполнение распределения кучи для каждого типа.
- Оболочка класса для типа значения. Это строго типизировано, но все равно связано с распределением кучи, и вам нужно написать обертку.
- Структурная оболочка, поддерживающая концепцию nullability. Это хорошее решение, но вы должны написать его самостоятельно.