当前位置:编程学习 > C#/ASP.NET >>

[C#学习笔记]Nullable类型,C#溢出检查,typeof运算符和运算符的重载

 1)Nullable类型
一个Nullable类型就是基本类型加上一个“是否为null指示器”的合成类型。对于一个类型,如果既可以给它分配一个值,也可以给它分配null引用(表示没有任何值),我们就说这个类型是可以空的。因此,可空类型可表示一个值,或表示不存在任何值。例如,类似String的引用类型就是可空类型,而类似Int32的值类型不是可空类型。由于值类型的容量只够表示适合于该类型的值,因此它不可为空。
有些人认为int型变量的值为0就表示空,这是不对的,0也是它的值,而并不表示空。
看下面的代码演示:
 
static void Main(string[] args) 
        { 
            //int n = null; 
            //当直接给int类型赋值null时,编译器报错“无法将Null型转化为int型,因为它是一种不可以为null型的类型” 
            int? oneValue = null; 
            //定义Nullable类型和定义非Nullable类型非常相似,关键在于类型后面的修饰符“?” 
            //int? oneValue = 10; 
            if (oneValue.HasValue)//使用Nullable类型的HasValue属性来判定是否有值存储 
            { 
                //int nNum = oneValue; 
                //如果尝试获取oneValue的值,编译器就会报错 
                Console.WriteLine(oneValue.Value); 
            } 
            else 
            { 
                Console.WriteLine("oneValue的值为空!"); 
            } 
        } 
2)C#的溢出检查
 
当一种整型转换到另一种整型,这个过程取决于溢出检查上下文。checked关键字用于对整型算术运算和转换显式启用溢出检查,而unchecked关键字则用于取消整型算术运算和转换的溢出检查。
①启用溢出检查:当操作数的值在目标类型的取值范围内,则转换成功,否则将要抛出异常。
看下面代码演示:
 
class TypeConvert 
    { 
        static void Main(string[] args) 
        { 
            TypeConvert typeConvert = new TypeConvert(); 
            typeConvert.DoSomething(); 
        } 
 
        public void DoSomething() 
        { 
            //MyInt的值为2147483647 
            try 
            { 
                int MyInt = int.MaxValue; 
                byte MyByte = checked((byte)MyInt); 
            } 
            catch(OverflowException) 
            { 
                throw; 
            } 
        } 
    } 
 
在代码中MyInt的最大值是2147483647,在强制转换为byte类型后,由于byte的取值范围为0-255,在这里使用了checked关键字进行了溢出检查,这里的byte型MyByte型无法容纳远大于其容量的值而抛出异常。
 
②取消溢出检查
在类型转换的过程中不检查数据是否超过目标数据类型的最大值,意味着类型转换永远是成功的。如果源数据类型的取值范围大于目标类型的取值范围,超过的部分将会被截取掉;如果源数据的取值范围小于目标类型的,转换后将使用符号或者零填充至与目标类型的大小相等;如果等于,则直接转换成目标类型
看实例代码如下:
 
class TypeConvert 
    { 
        static void Main(string[] args) 
        { 
            TypeConvert typeConvert = new TypeConvert(); 
            typeConvert.DoSomething(); 
        } 
 
        public void DoSomething() 
        { 
            //MyInt的值为2147483647 
            try 
            { 
                int MyInt = int.MaxValue; 
        //byte MyByte = unchecked(byte)MyInt; 
        //这样写与下面的写法一样,区别就是生命了关键字 
                byte MyByte = (byte)MyInt; 
        //这里没有使用溢出检查,结果也不会抛出异常。但是转换的结果是有问题的,是byte类型的最大值255,与原始的值相差很大。 
            } 
            catch(OverflowException) 
            { 
                throw; 
            } 
        } 
    } 
 
 
③typeof运算符
typeof是一元运算符,用于返回任意一个类型的类型信息
 
typeof运算符的语法如下:  Type type=typeof(类型);
 
示例代码演示如下:
 
 
class Program 
    { 
        static void Main(string[] args) 
        { 
            Type t = typeof(Program); 
            Console.WriteLine("方法:"); 
 
            MethodInfo[] methodInfo = t.GetMethods(); 
            //返回该Type类型的所有公共方法 
            foreach (MethodInfo mInfo in methodInfo) 
            { 
                Console.WriteLine(mInfo.ToString()); 
            } 
 
            Console.WriteLine("成员:"); 
            MemberInfo[] memberInfo = t.GetMembers(); 
            //返回该Type类型的所有公共成员 
            foreach (MemberInfo mInfo in methodInfo) 
            { 
                Console.WriteLine(mInfo.ToString()); 
<
补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,