C#Nullable类型,C#溢出检查,typeof运算符和运算符的重载

简介:

 1)Nullable类型

一个Nullable类型就是基本类型加上一个“是否为null指示器”的合成类型。对于一个类型,如果既可以给它分配一个值,也可以给它分配null引用(表示没有任何值),我们就说这个类型是可以空的。因此,可空类型可表示一个值,或表示不存在任何值。例如,类似String的引用类型就是可空类型,而类似Int32的值类型不是可空类型。由于值类型的容量只够表示适合于该类型的值,因此它不可为空。

有些人认为int型变量的值为0就表示空,这是不对的,0也是它的值,而并不表示空。

看下面的代码演示:

 

 
  1. static void Main(string[] args) 
  2.         { 
  3.             //int n = null; 
  4.             //当直接给int类型赋值null时,编译器报错“无法将Null型转化为int型,因为它是一种不可以为null型的类型” 
  5.             int? oneValue = null
  6.             //定义Nullable类型和定义非Nullable类型非常相似,关键在于类型后面的修饰符“?” 
  7.             //int? oneValue = 10; 
  8.             if (oneValue.HasValue)//使用Nullable类型的HasValue属性来判定是否有值存储 
  9.             { 
  10.                 //int nNum = oneValue; 
  11.                 //如果尝试获取oneValue的值,编译器就会报错 
  12.                 Console.WriteLine(oneValue.Value); 
  13.             } 
  14.             else 
  15.             { 
  16.                 Console.WriteLine("oneValue的值为空!"); 
  17.             } 
  18.         } 

2)C#的溢出检查

 

当一种整型转换到另一种整型,这个过程取决于溢出检查上下文。checked关键字用于对整型算术运算和转换显式启用溢出检查,而unchecked关键字则用于取消整型算术运算和转换的溢出检查。

①启用溢出检查:当操作数的值在目标类型的取值范围内,则转换成功,否则将要抛出异常。

看下面代码演示:

 

 
  1. class TypeConvert 
  2.     { 
  3.         static void Main(string[] args) 
  4.         { 
  5.             TypeConvert typeConvert = new TypeConvert(); 
  6.             typeConvert.DoSomething(); 
  7.         } 
  8.  
  9.         public void DoSomething() 
  10.         { 
  11.             //MyInt的值为2147483647 
  12.             try 
  13.             { 
  14.                 int MyInt = int.MaxValue; 
  15.                 byte MyByte = checked((byte)MyInt); 
  16.             } 
  17.             catch(OverflowException) 
  18.             { 
  19.                 throw
  20.             } 
  21.         } 
  22.     } 

 

在代码中MyInt的最大值是2147483647,在强制转换为byte类型后,由于byte的取值范围为0-255,在这里使用了checked关键字进行了溢出检查,这里的byte型MyByte型无法容纳远大于其容量的值而抛出异常。

 

②取消溢出检查

在类型转换的过程中不检查数据是否超过目标数据类型的最大值,意味着类型转换永远是成功的。如果源数据类型的取值范围大于目标类型的取值范围,超过的部分将会被截取掉;如果源数据的取值范围小于目标类型的,转换后将使用符号或者零填充至与目标类型的大小相等;如果等于,则直接转换成目标类型

看实例代码如下:

 
  1. class TypeConvert 
  2.     { 
  3.         static void Main(string[] args) 
  4.         { 
  5.             TypeConvert typeConvert = new TypeConvert(); 
  6.             typeConvert.DoSomething(); 
  7.         } 
  8.  
  9.         public void DoSomething() 
  10.         { 
  11.             //MyInt的值为2147483647 
  12.             try 
  13.             { 
  14.                 int MyInt = int.MaxValue; 
  15.         //byte MyByte = unchecked(byte)MyInt; 
  16.         //这样写与下面的写法一样,区别就是生命了关键字 
  17.                 byte MyByte = (byte)MyInt; 
  18.         //这里没有使用溢出检查,结果也不会抛出异常。但是转换的结果是有问题的,是byte类型的最大值255,与原始的值相差很大。 
  19.             } 
  20.             catch(OverflowException) 
  21.             { 
  22.                 throw
  23.             } 
  24.         } 
  25.     } 

 

 

③typeof运算符
typeof是一元运算符,用于返回任意一个类型的类型信息
typeof运算符的语法如下:  Type type=typeof(类型);
示例代码演示如下:

 
  1. class Program 
  2.     { 
  3.         static void Main(string[] args) 
  4.         { 
  5.             Type t = typeof(Program); 
  6.             Console.WriteLine("方法:"); 
  7.  
  8.             MethodInfo[] methodInfo = t.GetMethods(); 
  9.             //返回该Type类型的所有公共方法 
  10.             foreach (MethodInfo mInfo in methodInfo) 
  11.             { 
  12.                 Console.WriteLine(mInfo.ToString()); 
  13.             } 
  14.  
  15.             Console.WriteLine("成员:"); 
  16.             MemberInfo[] memberInfo = t.GetMembers(); 
  17.             //返回该Type类型的所有公共成员 
  18.             foreach (MemberInfo mInfo in methodInfo) 
  19.             { 
  20.                 Console.WriteLine(mInfo.ToString()); 
  21.             } 
  22.  
  23.             Console.ReadKey(); 
  24.         } 
  25.     } 

 

 

运行结果如下图:

 

 

 

④运算符的重载

运算符重载只能应用于类或结构。要重载一个运算符,可以声明一个名为operator X的方法并实现它,如operator +和operator -,一元运算符和二元运算符都可以被重载,相应地,重载方法分别带一个或者两个参数(类或者结构类型),其语法为:

  //一元运算符的重载        public static 自定义类型 operator 要重载的运算符(类型)        //二元运算符的重载        public static 自定义类型 operator 要重载的运算符(类型1,类型2)

注意:所有运算符的重载均是静态的方法,必须得用public修饰

代码示例如下:

 

 
  1. class Program 
  2.     { 
  3.         public int Value { get;set; } 
  4.  
  5.         static void Main(string[] args) 
  6.         { 
  7.             Program o1 = new Program(); 
  8.             o1.Value = 10; 
  9.             Program o2 = new Program(); 
  10.             o2.Value = 20; 
  11.  
  12.             Program o3 = o1 + o2; 
  13.             Console.WriteLine(o3.Value); 
  14.             Console.ReadKey(); 
  15.         } 
  16.  
  17.         /// <summary> 
  18.         /// 这里为Program类重载了“加(+)”运算符实现了两个对象的相加的功能,运算符的重载提高了编程的便利性 
  19.         /// </summary> 
  20.         /// <param name="o1"></param> 
  21.         /// <param name="o2"></param> 
  22.         /// <returns></returns> 
  23.         public static Program operator +(Program o1, Program o2) 
  24.         { 
  25.             Program o = new Program(); 
  26.             o.Value = o1.Value + o2.Value; 
  27.             return o; 
  28.         } 
  29.     } 


 

     本文转自yisuowushinian 51CTO博客,原文链接:http://blog.51cto.com/yisuowushinian/1040068,如需转载请自行联系原作者






 

相关文章
|
3月前
|
存储 安全 编译器
C# 11.0中的泛型属性:类型安全的新篇章
【1月更文挑战第23天】C# 11.0引入了泛型属性的概念,这一新特性为开发者提供了更高级别的类型安全性和灵活性。本文将详细探讨C# 11.0中泛型属性的工作原理、使用场景以及它们对现有编程模式的改进。通过深入了解泛型属性,开发者将能够编写更加健壮、可维护的代码,并充分利用C#语言的最新发展。
|
7月前
|
编译器 C#
C#之十七 局部类型
C#之十七 局部类型
17 0
|
1月前
|
C# 数据安全/隐私保护
C#运算符
C#运算符
9 0
|
1月前
|
存储 C# 开发者
C#变量类型
C#变量类型
19 0
|
3月前
|
C# Python
C# 笔记3 - 重载一系列像python那样的print()方法
C# 笔记3 - 重载一系列像python那样的print()方法
29 1
|
3月前
|
开发框架 .NET 编译器
C# 9.0中的目标类型新表达式:类型推断的又一进步
【1月更文挑战第16天】C# 9.0引入了目标类型新表达式,这是类型推断功能的一个重要扩展。通过目标类型新表达式,开发者在创建对象时可以省略类型名称,编译器会根据上下文自动推断所需类型。这一特性不仅简化了代码编写,还提高了代码的可读性和维护性。本文将详细介绍目标类型新表达式的语法、使用场景及其对C#编程的影响。
|
3月前
|
C#
C# 运算符详解:包含算术、赋值、比较、逻辑运算符及 Math 类应用
运算符用于对变量和值执行操作。在C#中,有多种运算符可用,包括算术运算符、关系运算符、逻辑运算符等。
49 1
|
3月前
|
存储 C#
C#入门开发(Hello World,运算符)
C#入门开发(Hello World,运算符)
28 0
|
3月前
|
存储 C# 容器
掌握 C# 变量:在代码中声明、初始化和使用不同类型的综合指南
变量是用于存储数据值的容器。 在 C# 中,有不同类型的变量(用不同的关键字定义),例如: int - 存储整数(没有小数点的整数),如 123 或 -123 double - 存储浮点数,有小数点,如 19.99 或 -19.99 char - 存储单个字符,如 'a' 或 'B'。Char 值用单引号括起来 string - 存储文本,如 "Hello World"。String 值用双引号括起来 bool - 存储具有两个状态的值:true 或 false
37 2
|
3月前
|
存储 安全 算法
C# 泛型:类型参数化的强大工具
【1月更文挑战第7天】本文将深入探讨C#语言中的泛型编程,包括泛型的定义、用途、优势以及实际应用。通过类型参数化,泛型允许开发者编写更加灵活且可重用的代码,同时提高程序的类型安全性和性能。本文将通过示例代码和详细解释,帮助读者更好地理解泛型在C#中的重要性和实用性。