C#Nullable类型,C#溢出检查,typeof运算符和运算符的重载
2012-10-28 19:42
615 查看
1)Nullable类型
一个Nullable类型就是基本类型加上一个“是否为null指示器”的合成类型。对于一个类型,如果既可以给它分配一个值,也可以给它分配null引用(表示没有任何值),我们就说这个类型是可以空的。因此,可空类型可表示一个值,或表示不存在任何值。例如,类似String的引用类型就是可空类型,而类似Int32的值类型不是可空类型。由于值类型的容量只够表示适合于该类型的值,因此它不可为空。
有些人认为int型变量的值为0就表示空,这是不对的,0也是它的值,而并不表示空。
看下面的代码演示:
2)C#的溢出检查
当一种整型转换到另一种整型,这个过程取决于溢出检查上下文。checked关键字用于对整型算术运算和转换显式启用溢出检查,而unchecked关键字则用于取消整型算术运算和转换的溢出检查。
①启用溢出检查:当操作数的值在目标类型的取值范围内,则转换成功,否则将要抛出异常。
看下面代码演示:
在代码中MyInt的最大值是2147483647,在强制转换为byte类型后,由于byte的取值范围为0-255,在这里使用了checked关键字进行了溢出检查,这里的byte型MyByte型无法容纳远大于其容量的值而抛出异常。
②取消溢出检查
在类型转换的过程中不检查数据是否超过目标数据类型的最大值,意味着类型转换永远是成功的。如果源数据类型的取值范围大于目标类型的取值范围,超过的部分将会被截取掉;如果源数据的取值范围小于目标类型的,转换后将使用符号或者零填充至与目标类型的大小相等;如果等于,则直接转换成目标类型
[/code]
本文出自 “强子的专栏” 博客,请务必保留此出处http://yisuowushinian.blog.51cto.com/4241271/1040068
一个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(类型);示例代码演示如下:
[code]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());
}
Console.ReadKey();
}
}
[/code]
运行结果如下图:
④运算符的重载运算符重载只能应用于类或结构。要重载一个运算符,可以声明一个名为operator X的方法并实现它,如operator +和operator -,一元运算符和二元运算符都可以被重载,相应地,重载方法分别带一个或者两个参数(类或者结构类型),其语法为: //一元运算符的重载 public static 自定义类型 operator 要重载的运算符(类型) //二元运算符的重载 public static 自定义类型 operator 要重载的运算符(类型1,类型2)注意:所有运算符的重载均是静态的方法,必须得用public修饰代码示例如下:class Program { public int Value { get;set; } static void Main(string[] args) { Program o1 = new Program(); o1.Value = 10; Program o2 = new Program(); o2.Value = 20; Program o3 = o1 + o2; Console.WriteLine(o3.Value); Console.ReadKey(); } /// <summary> /// 这里为Program类重载了“加(+)”运算符实现了两个对象的相加的功能,运算符的重载提高了编程的便利性 /// </summary> /// <param name="o1"></param> /// <param name="o2"></param> /// <returns></returns> public static Program operator +(Program o1, Program o2) { Program o = new Program(); o.Value = o1.Value + o2.Value; return o; } }
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。
本文出自 “强子的专栏” 博客,请务必保留此出处http://yisuowushinian.blog.51cto.com/4241271/1040068
相关文章推荐
- Nullable类型,C#溢出检查,typeof运算符和运算符的重载 分类: C# 2012-10-28 19:50 648人阅读 评论(0) 收藏
- Nullable类型,C#溢出检查,typeof运算符和运算符的重载
- Nullable类型,C#溢出检查,typeof运算符和运算符的重载
- C#Nullable类型,C#溢出检查,typeof运算符和运算符的重载
- C#类型转换时的溢出检查
- JavaScript中的七种值类型与typeof运算符
- as3数据类型检查写法(is/as/typeof/in/instanceof)用法介绍
- CLR-基元类型以及溢出检查 (CLR-Via-C#) 类型基础
- 原始类型之typeof运算符
- 【第二篇日记】C# 的转义字符,结构定义、字符转换、类型检查、运算符以及正则表达式
- C++:特殊运算符的重载star、小括号、TYPE自定义类型、new和delete
- C# checked 检查整型数据运算溢出 as,is运算符 可空类型空结合
- C#学习篇(八)Nullable类型、checked关键字、运算符重载
- nullable数据类型和c#2.0运算符“??”,数据库可能为空时候的一种处理办法
- struts2.xml中使用chain和redirectAction这两个类型结果(type-result)时,报检查错误(validation)
- C#方法重载-基于不同类型的参数的方法重载
- c++ 重载类型转换运算符
- 空接合运算符 ??--- ?:--- int? C#中的可空类型
- 第13章 运算符类型与运算符重载
- Java SE 第三讲(原生数据类型使用陷阱 Pitfall of Primitive Data Type)