ValueType と参照型の重要な違いは、値型にはこれらの「値のセマンティクス」があるということです。DateTime、Int32、およびその他すべての値の型には ID がありません。Int32 の "42" は、同じ値を持つ他の Int32 と本質的に区別できません。
すべての値型「オブジェクト」は、スタック上または参照型オブジェクトの一部として存在します。特別なケースの 1 つは、値型インスタンスをオブジェクトまたはインターフェイスにキャストする場合です。これは「ボックス化」と呼ばれ、抽出して戻すことができる値のみを含むダミーの参照型オブジェクトを作成するだけです (「ボックス化解除」)。 .
一方、参照型には ID があります。「new Object()」は、GC ヒープ上の個別のインスタンスであるため、他の「new Object()」と等しくありません。一部の参照型は、Equals メソッドとオーバーロードされた演算子を提供して、より値のように動作するようにします。実際には 2 つの異なるオブジェクトであっても、文字列 "abc" は他の "abc" 文字列と等しくなります。
したがって、参照がある場合、有効なオブジェクトのアドレスを含むか、null にすることができます。値型オブジェクトがすべてゼロの場合、それらは単にゼロです。例えば。整数のゼロ、浮動小数のゼロ、ブール値の false、または DateTime.MinValue。"ゼロ" と "値の欠落/null" を区別する必要がある場合は、別のブール値フラグを使用するか、.NET 2.0 の Nullable<T> クラスを使用することをお勧めします。これは単に値にブール値フラグを加えたものです。CLR にもサポートがあるため、HasValue=false で Nullable をボックス化すると、この構造を自分で実装した場合のように false+zero でボックス化された構造ではなく、null 参照になります。