·天新网首页·加入收藏·设为首页·网站导航
数码笔记本手机摄像机相机MP3MP4GPS
硬件台式机网络服务器主板CPU硬盘显卡
办公投影打印传真
家电电视影院空调
游戏网游单机动漫
汽车新车购车试驾
下载驱动源码
学院开发设计
考试公务员高考考研
业界互联网通信探索
您现在的位置:天新网 > 软件开发 > .Net开发 > C#
[C#基础知识系列]专题九:全面解析可空类型
http://www.21tx.com 2012年12月04日

1 2 下一页

 C# 2.0 中还引入了可空类型,可空类型也是值类型,只是可空类型是包括null的值类型的,下面就介绍下C#2.0中对可空类型的支持具体有哪些内容(最近一直都在思考如何来分享这篇文章的,因为刚开始觉得可空类型使用过程中比较简单,觉得没有讲的必要,但是考虑到这个系列的完整性,决定还是唠叨下吧,希望对一些不熟悉的人有帮助)。

一、为什么会有可空类型

  如果朋友们看了我之前的分享,对于这一部分都不会陌生,因为我一般介绍C#特性经常会以这样的方式开头的, 因为每个特性都是有它出现的原因的(有一句佛语这是这么讲的:万事皆有因,有因必有果),首先来说说这个因的(果当然是新增加了可空类型这个新特性了。),当我们在设计数据库的时候,我们可以设置数据库字段允许为null值,如果数据库字段是日期等这样在C#语言是值类型时,当我们把数据库表映射一个对象时,此时Datetime类型在C# 语言中是不能为null的,如果这样就会与数据库的设计有所冲突,这样开发人员就会有这样的需求了——值类型能不能也为可空类型的?同时微软也看出了用户有这样的需求,所以微软在C# 2.0中就新增加了一种类型——可空类型,即包含null值的值类型,这个也就是我理解的因了,介绍完因之后,当然就是好好唠叨下可空类型是个什么东西的了?

二、可空类型的介绍

  可空类型也是值类型,只是它是包含null的一个值类型。我们可以像下面这样表示可空类型(相信大家都不陌生):

int? nullable = null;

  上面代码 int? 就是可空的int类型(有人可能会这样的疑问的, 如果在C#1中我硬要让一个值类型为一个可空类型怎么办到呢?当然这个在C#1之前也是有可以办到的,只是会相当麻烦,对于这个如果有兴趣的朋友可以去刨下根),然而其实 "?"这个修饰符只是C#提供的一个语法糖(所谓语法糖,就是C#提供的一种方便的形式,其实肯定没有int? 这个类型,这个int?编译器认为的就是Nullable<int>类型,即可空类型),其实真真C# 2.0提供的可空类型是——Nullable<T>(这个T就是上专题介绍的泛型参数,其中T只能为值类型,因为从可空类型的定义为:publicstruct Nullable<T> where T : struct)和Nullable。下面给出一段代码来介绍可空类型的使用:

namespace 可空类型Demo   
{   
    class Program   
    {   
        static void Main(string[] args)   
        {   
            // 下面代码也可以这样子定义int? value=1;   
            Nullable<int> value = 1;   
       
            Console.WriteLine("可空类型有值的输出情况:");   
            Display(value);   
            Console.WriteLine();   
            Console.WriteLine();   
       
            value = new Nullable<int>();   
            Console.WriteLine("可空类型没有值的输出情况:");   
            Display(value);   
            Console.Read();   
        }   
       
        // 输出方法,演示可空类型中的方法和属性的使用   
        private static void Display(int? nullable)   
        {   
            // HasValue 属性代表指示可空对象是否有值   
            // 在使用Value属性时必须先判断可空类型是否有值,   
            // 如果可空类型对象的HasValue返回false时,将会引发InvalidOperationException异常   
            Console.WriteLine("可空类型是否有值:{0}", nullable.HasValue);   
            if (nullable.HasValue)   
            {   
                Console.WriteLine("值为: {0}", nullable.Value);   
            }   
       
            // GetValueOrDefault(代表如果可空对象有值,就用它的值返回,如果可空对象不包含值时,使用默认值0返回)相当与下面的语句   
            // if (!nullable.HasValue)   
            // {   
            //    result = d.Value;   
            // }   
       
            Console.WriteLine("GetValueorDefault():{0}", nullable.GetValueOrDefault());   
       
            // GetValueOrDefault(T)方法代表如果 HasValue 属性为 true,则为 Value 属性的值;否则为 defaultValue 参数值,即2。   
            Console.WriteLine("GetValueorDefalut重载方法使用:{0}", nullable.GetValueOrDefault(2));   
       
            // GetHashCode()代表如果 HasValue 属性为 true,则为 Value 属性返回的对象的哈希代码;如果 HasValue 属性为 false,则为零   
            Console.WriteLine("GetHashCode()方法的使用:{0}", nullable.GetHashCode());   
        }   
    }   
}

输出结果:

[C#基础知识系列]专题九:全面解析可空类型

上面的演示代码中都注释,这里就不再解释了,为了让大家明白进一步理解可空类型是值类型,下面贴出中间语言代码截图:

[C#基础知识系列]专题九:全面解析可空类型

三、空合并操作符(?? 操作符)

  ??操作符也就是"空合并操作符",它代表的意思是两个操作数,如果左边的数不为null时,就返回左边的数,如果左边的数为null,就返回右边的数,这个操作符可以用于可空类型,也可以用于引用类型,但是不能用于值类型(之所以不能应用值类型(这里除了可空类型),因为??运算符要对左边的数与null进行比较,然而值类型,不能与null类型比较,所以就不支持??运算符),下面用一个例子来掩饰下??运算符的使用(??这个运算符可以方便我们设置默认值,可以避免在代码中写if, else语句,简单代码数量,从而有利于阅读。)

static void Main(string[] args)   
        {   
            Console.WriteLine("??运算符的使用如下:");   
            NullcoalescingOperator();   
            Console.Read();   
        }   
       
        private static void NullcoalescingOperator()   
        {   
            int? nullable = null;   
            int? nullhasvalue = 1;   
                   
            // ??和三目运算符的功能差不多的   
            // 所以下面代码等价于:   
            // x=nullable.HasValue?b.Value:12;   
            int x = nullable ?? 12;   
       
            // 此时nullhasvalue不能null,所以y的值为nullhasvalue.Value,即输出1   
            int y = nullhasvalue ?? 123;   
            Console.WriteLine("可空类型没有值的情况:{0}",x);   
            Console.WriteLine("可空类型有值的情况:{0}", y);   
       
            // 同时??运算符也可以用于引用类型, 下面是引用类型的例子   
            Console.WriteLine();   
            string stringnotnull = "123";   
            string strinGISnull = null;   
                  
            // 下面的代码等价于:   
            // (stringnotnull ==null)? "456" :stringnotnull   
            // 同时下面代码也等价于:   
            // if(stringnotnull==null)   
            // {   
            //      return "456";   
            // }   
            // else   
            // {   
            //      return stringnotnull;   
            // }   
            // 从上面的等价代码可以看出,有了??运算符之后可以省略大量的if—else语句,这样代码少了, 自然可读性就高了   
            string result = stringnotnull ?? "456";   
            string result2 = stringisnull ?? "12";   
            Console.WriteLine("引用类型不为null的情况:{0}", result);   
            Console.WriteLine("引用类型为null的情况:{0}", result2);   
        }

下面是运行结果截图:

上一篇: C#委托基础7——匿名方法
下一篇: C#委托基础2——多路委托

1 2 下一页

关于我们 | 联系我们 | 加入我们 | 广告服务 | 投诉意见 | 网站导航
Copyright © 2000-2011 21tx.com, All Rights Reserved.
晨新科技 版权所有 Created by TXSite.net