Одно очевидное решение состояло в том, чтобы указатели памяти были больше, чем ваша доступная оперативная память, например, 34-разрядные указатели на 32-разрядной машине. Или используйте самые верхние 8 бит 32-битной машины, когда у вас только 16 МБ ОЗУ (2 ^ 24). Машины Oberon в ETH Zurich использовали такую схему с большим успехом, пока оперативная память не стала слишком дешевой. Это было примерно в 1994 году, поэтому идея довольно старая.
Это дает вам пару битов, в которых вы можете сохранить состояние объекта (например, «это новый объект» и «я только что коснулся этого объекта»). При выполнении GC предпочитайте объекты с надписью «это новое» и избегайте «только что коснулись».
На самом деле это может увидеть ренессанс, потому что ни у кого нет 2 ^ 64 байт оперативной памяти (= 2 ^ 67 битов; во вселенной около 10 ^ 80 ~ 2 ^ 240 атомов, так что это может быть невозможно много оперативной памяти когда-либо ). Это означает, что вы можете использовать пару бит в современных машинах , если виртуальная машина может указать ОС, как отобразить память.
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;
Не используйте типы, допускающие значение NULL, потому что они «классная новинка» вещь "вы открыли. Используйте их там, где они применимы и действительно полезны.
Их использование сопряжено с накладными расходами, и при неправильном использовании они излишне увеличивают сложность вашего кода.
Вы также должны быть осторожны, чтобы избежать нулевых разыменований, поэтому они возлагают дополнительную нагрузку на программистов, работающих с этим кодом. (В некоторых случаях это предпочтительнее, чем обходной подход!)
Еще пара хороших идей для использования типов, допускающих значение NULL:
Nullable
- это то же самое, что int?
var.HasValue
) и приведите его к базовому типу, прежде чем использовать его в качестве базового типа. Они кажутся подходящими для начального значения некоторых переменных типа значения.
int? lastCodeReceived;
if (lastCodeReceived.HasValue)
{
// At least one code has been received.
}
Я редко использую типы, допускающие значение NULL. Единственное место, где я их использую, - это когда я m работает с нулевыми типами в базе данных.