Подтвердить что ты не робот

Каков целочисленный ссылочный тип в С#?

Я хотел бы иметь целочисленную переменную, которая может быть установлена ​​в нуль и не хочет использовать синтаксис int? myVariable. Я пробовал использовать int и Int16 безрезультатно. Должен ли я использовать int? myVariable?

Я упомянул об этом, потому что в Java есть как тип "int" (примитив), так и "Integer" (ссылочный тип). Я хотел быть уверенным, что не существует встроенного целочисленного ссылочного типа, который я мог бы использовать. Я буду использовать 'int?' за то, что я делаю.

4b9b3361

Ответ 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; //

Ответ 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. Это хорошее решение, но вы должны написать его самостоятельно.