Важное различие между ValueTypes и ссылочными типами состоит в том, что типы значений имеют эту «семантику значений». DateTime, Int32 и все другие типы значений не имеют идентификатора, Int32 «42» по существу неотличим от любого другого Int32 с тем же значением.
Все типы значений «объекты» существуют либо в стеке, либо как часть объекта ссылочного типа. Одним из особых случаев является то, что экземпляр типа значения присваивается объекту или интерфейсу - это называется «бокс», и он просто создает объект фиктивного ссылочного типа, который содержит только значение, которое можно извлечь обратно («unboxed») ,
С другой стороны, типы ссылок имеют личность. «новый объект()» не равен никакому другому «новому объекту()», поскольку они представляют собой отдельные экземпляры в куче GC. Некоторые ссылочные типы предоставляют метод Equals и перегруженные операторы, так что они ведут себя более ценно, например, например. Строка «abc» равна другой строке «abc», даже если они фактически являются двумя разными объектами.
Поэтому, когда у вас есть ссылка, он может содержать адрес действительного объекта или может быть нулевым. Когда объекты типа значения все-ноль, они просто равны нулю. Например. целое число 0, ноль с плавающей точкой, логическое значение false или DateTime.MinValue. Если вам нужно различать «ноль» и «значение missing/null», вам нужно использовать либо отдельный логический флаг, либо, еще лучше, использовать класс Nullable < T> в .NET 2.0. Это просто значение плюс флаг Boolean. В CLR также поддерживается поддержка, так что бокс Nullable с HasValue = false приводит к нулевой ссылке, а не в коробке с ложным + нолем, как если бы вы сами реализовали эту структуру.
Это Джон, а не Джон. –