Что такое целочисленный ссылочный тип в C #? - PullRequest
12 голосов
/ 28 января 2010

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

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

Ответы [ 8 ]

26 голосов
/ 28 января 2010

Для информации int? / Nullable<T> - это , а не тип ссылки; это просто «обнуляемый тип», что означает: структуру (по существу и int и флаг bool) со специальными правилами компилятора (проверки нуля, операторы и т. д.) и правилами CLI (для упаковки / распаковки). - это нет "целочисленного ссылочного типа" в .NET, если не считать бокс:

int i = 123;
object o = i; // box

, но это создает ненужный объект и имеет множество других связанных с этим проблем.

Для того, что вы хотите, int? должно быть идеальным. Вы могли бы использовать синтаксис длинной руки (Nullable<int>), но IMO это излишне многословно, и я видел, как это сбивает с толку людей.

8 голосов
/ 28 января 2010

Да, вы должны использовать обнуляемые типы

См. Обнуляемый

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 голосов
/ 28 января 2010

Обнуляемые типы являются экземплярами структуры System.Nullable (T).
Следовательно, int, int ?, Nullable - это все значение типы, а не ссылка типы

2 голосов
/ 28 января 2010

Да, это единственный способ, так как Int32 / Int16 / int является примитивным типом (независимо от того, упакован он или нет).

0 голосов
/ 28 января 2010

Вы должны будете использовать обнуляемый тип, то есть:

Nullable<int> or int?

Назначение типа nullable состоит в том, чтобы дать вам возможность присвоить null типу значения.

Из MSDN:

Обнуляемые типы относятся к сценарию, в котором вы хотите иметь примитивный тип с нулевым (или неизвестным) значением. Это распространено в сценариях базы данных, но также полезно в других ситуациях.

В прошлом было несколько способов сделать это:

  1. Тип значения в штучной упаковке. Это не является строго типизированным во время компиляции и включает в себя выделение кучи для каждого типа.
  2. Обертка класса для типа значения. Это строго типизировано, но все еще включает в себя выделение кучи, и вам нужно написать оболочку.
  3. Структурная оболочка, поддерживающая концепцию обнуляемости. Это хорошее решение, но вы должны написать его сами.
0 голосов
/ 28 января 2010

Вы можете использовать System.Nullable<int>, если вы так ненавидите ?.

0 голосов
/ 28 января 2010

Да. Вот почему Microsoft добавила это. Люди создавали свой собственный класс Nullable, поэтому они включили этот шаблон в .NET.

0 голосов
/ 28 января 2010

Синтаксис <var>? делает его обнуляемым. Если вы покопаетесь немного глубже, вы увидите, что используется только общий объект.

Если вы хотите сделать это как C ++, вы должны использовать небезопасные операции. Затем доступны указатели, подобные C, но ваш код не соответствует CLR ...

Для использования чистого .NET без указателей, ? - это путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...