Сам по себе нулевой указатель будет занимать 4 или 8 байтов, в зависимости от того, работает ли он как 32-разрядный или 64-разрядный, как вы и предполагали.
Может быть больше, чем это в данной коллекции. Реализация Dictionary<TKey, TValue>
использует как массив структур Entry<TKey, TValue>
, который содержит два int
s, а также ключ и значение, а также массив целых чисел, используемых при индексации в этом массиве. Следовательно, даже если бы не было «растущего пространства» (и, как правило, оно есть), для каждой записи потребовалось бы 20 или 24 байта памяти (а не только 8 или 12, связанные с размером ключа и значением), в дополнение к накладным расходам на сам словарь (включая накладные расходы каждого массива).
Другие реализации и другие коллекции будут иметь другие накладные расходы. Они могут даже не хранить null
для пустой записи. null
может быть полезным способом указать, что значение не было записано; в этом случае специальное значение будет указывать фактическое значение null
(особенно полезно в реализациях словаря без блокировки, где может быть полезно различать не просто неустановленное и установленное значение, но между неустановленным, установленным и частично установленным значением).
Все, что вы действительно можете сказать, это то, что установка добавления значения null
A) занимает немного памяти, а B) не занимает память, которая с ненулевым значением будет занята самим объектом. Даже B) на самом деле не выполняется, так как, если этот объект также был сохранен в другом месте, то нет необходимости в дополнительной стоимости памяти для наличия другой ссылки в другом месте, кроме самой ссылки, что делает ее реальную стоимость такой же, как хранение null
.