Кодирование методов для [закрытого] типа C# Nullable

Одно очевидное решение состояло в том, чтобы указатели памяти были больше, чем ваша доступная оперативная память, например, 34-разрядные указатели на 32-разрядной машине. Или используйте самые верхние 8 бит 32-битной машины, когда у вас только 16 МБ ОЗУ (2 ^ 24). Машины Oberon в ETH Zurich использовали такую ​​схему с большим успехом, пока оперативная память не стала слишком дешевой. Это было примерно в 1994 году, поэтому идея довольно старая.

Это дает вам пару битов, в которых вы можете сохранить состояние объекта (например, «это новый объект» и «я только что коснулся этого объекта»). При выполнении GC предпочитайте объекты с надписью «это новое» и избегайте «только что коснулись».

На самом деле это может увидеть ренессанс, потому что ни у кого нет 2 ^ 64 байт оперативной памяти (= 2 ^ 67 битов; во вселенной около 10 ^ 80 ~ 2 ^ 240 атомов, так что это может быть невозможно много оперативной памяти когда-либо ). Это означает, что вы можете использовать пару бит в современных машинах , если виртуальная машина может указать ОС, как отобразить память.

20
задан Jon Seigel 7 April 2010 в 02:45
поделиться

5 ответов

Nullable is useful for when you need a possible invalid state for a value type, or if the data is being retrieved from a database that may contain a null value for the column. It is very common in some old FORTRAN code I am porting to C# for invalid values to be negative or 0, but this is troublesome especially when the values are used in mathematical functions. It is far more explicit to use Nullable to show that possible invalid state.

It is worth mentioning that the following is the same:

Nullable<int> myNullableInt;
int? myNullableInt;
13
ответ дан 29 November 2019 в 23:23
поделиться

Не используйте типы, допускающие значение NULL, потому что они «классная новинка» вещь "вы открыли. Используйте их там, где они применимы и действительно полезны.

Их использование сопряжено с накладными расходами, и при неправильном использовании они излишне увеличивают сложность вашего кода.

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

19
ответ дан 29 November 2019 в 23:23
поделиться

Еще пара хороших идей для использования типов, допускающих значение NULL:

  • Не забывайте о гибкости синтаксиса. Nullable - это то же самое, что int?
  • Проверьте значение null ( var.HasValue ) и приведите его к базовому типу, прежде чем использовать его в качестве базового типа.
5
ответ дан 29 November 2019 в 23:23
поделиться

Они кажутся подходящими для начального значения некоторых переменных типа значения.

int? lastCodeReceived;

if (lastCodeReceived.HasValue)
{
    // At least one code has been received.
}
2
ответ дан 29 November 2019 в 23:23
поделиться

Я редко использую типы, допускающие значение NULL. Единственное место, где я их использую, - это когда я m работает с нулевыми типами в базе данных.

1
ответ дан 29 November 2019 в 23:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: