buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

如果你知道时间的默认值...

【情景1】执行如下测试代码:

string str;

Console.WriteLine(str); //报错,使用了未赋值的局部变量"str"  ----DateTime也是这个情况

 

【情景2】定义实体类

class DateTimeAndStringTest {

    public DateTime Time { get; set; }

    public string StringText { get; set; }

}

执行如下测试代码:

DateTimeAndStringTest obj = new DateTimeAndStringTest();

Console.WriteLine("{0},{1},{2}", DateTime.MinValue, obj.Time, obj.StringText == null);//结果:0001/1/1 0:00:00, 0001/1/1 0:00:00, True

 

可见,在这个实体类对象里,其string类型的属性默认值是Null,而Datetime类型的属性的默认值是DateTime.MinValue,不是null。 

所以,你如果写下面的判断 Console.WriteLine(obj.Time == null ? DateTime.MinValue : obj.Time); 那么IDE就会智能提示你:“检测到无法访问的表达式代码”

如果你知道时间的默认值,就再不要做上面的无用的判断了。

 

这种不同最后还是归结于值类型&引用类型的区别。

String类是sealed class,即引用类型,默认值为空。而DateTime、int等都是struct类型,它们都有相应的默认值(enum的默认值同int,都是0),因此,这些默认值不为null的值类型可以用作泛型类型System.Nullable<T>中的参数T, 即可以声明public DateTime? Time { get; set; },这时,上面的输出Time属性值时就是null了。

posted on 2014-06-11 10:26  buguge  阅读(262)  评论(0编辑  收藏  举报