Одно ограничение для Java и .net состоит в том, что нет ничего, что бы четко определяло, следует ли семантически рассматривать место хранения ссылочного типа как , содержащее значение объекта, по сравнению с , идентифицирующим объект (с точки зрения компьютера, конечно, все такие места хранения делают последнее). Тем не менее, есть некоторые типы (например, String
), для которых место хранения обычно рассматривается как содержащее значение, а другие (например, StringBuilder
), для которых место хранения будет рассматриваться как идентифицирующий объект, над которым должны выполняться операции. быть выполненным.
Если бы не ограничение struct
для Nullable<T>
, и если типы классов могли бы указывать, что члены экземпляра должны запускаться (при this
, равном нулю) при вызове для нулевого объекта, я бы расценил это как превосходное шаблон для некоторых типов. Хотя обычно невозможно разумно указать значение по умолчанию для изменяемого типа класса, для многих неизменяемых типов вполне разумно иметь разумное поведение по умолчанию (например, default(string).Length
может возвращать ноль). К сожалению, языки .net не имеют возможности указать, что свойства и методы должны использоваться на нулевых объектах, но по крайней мере методы расширения могут немного помочь в этом направлении.