什么时候可以为空而不是可空?

时间:2015-04-24 19:44:34

标签: c#

尝试了解GetValueOrDefault()的默认行为。如果我有一个可空属性,GetValueOrDefault()将返回基础默认值或实例化值null ...因为该实例化值(null)将是值,所以我们不需要得到一个"默认"值。

例如:

namespace Nullable_test
{
   public class AutoPropNullTest
   {
     public int? AutoValue { get; set; }
   }

   public class ManualPropNullTest
   {

      private int? i;

      public int? ManualValue
      {
        get
        {
            return i;
        }

        set
        {
            i = value;
        }
      }
   }
}

以上将使用空值进行实例化,但调用ValueOrDefault将返回零。

        ManualPropNullTest x = new ManualPropNullTest();

        AutoPropNullTest y = new AutoPropNullTest();

        //x & y will inspect as null

        int? q = x.ManualValue.GetValueOrDefault();

        //q will result in zero

我知道这是一个分裂的头发类型的问题,只是试图调和我认为默认应该是什么以及现实是什么。

谢谢

4 个答案:

答案 0 :(得分:4)

Nullable<T>类型将值类型包装在编译器和运行时理解为&#34; nullable&#34;的类型中。类型,因为它可以在某些上下文中处理,就好像它可以有一个空值。

但请注意,null值表示值的缺席,而不是默认值。

当您致电GetValueOrDefault()时,您要求的是来自Nullable<T>值的不可为空的值,或值类型&# 39; s 拥有默认值,如果Nullable<T>值实际上是&#34; null&#34;。

在这种情况下,您应该期望基础默认值。这正是该方法旨在返回的内容。另请注意,这实际上是一个实际的,因此如果分配给另一个Nullable<T>变量,则会被视为非null (即值为本)。

答案 1 :(得分:3)

&#34;默认值&#34;实际上是

  

默认值的类型是当前的type参数   可以为空的对象,默认值的值仅包含在内   二进制零。

来自MSDN

所以要回答你的问题,无论二进制零值是什么类型参数。

答案 2 :(得分:1)

如果Nullable类型的HasValue为false,则GetValueOrDefault返回默认值(T)。 (默认(int)为0)

答案 3 :(得分:0)

int(Int32)的默认值为0. int? (Nullable)实例没有分配整数值,因此它返回int的默认值,即0。