C# 类型转换(知识要点归纳总结)
来源:互联网 发布:centos tmp 自动清理 编辑:程序博客网 时间:2024/05/29 04:06
C# 类型转换(知识要点归纳总结)
简介
C#是一门强类型语言,即在编译时静态类型化的,因此变量在声明后就无法再次声明,或者无法存储其它类型的值,除非把该值转化成声明的类型。当需要将一种类型变量的值复制到另一种类型的变量或参数中是,就需要类型转换。
- 隐式转换:这是一种类型安全的转换,不会导致数据丢失,不需要特殊语法。
- 显式转换(强制转换):显式转换需要强制转换运算符。在转换中可能丢失信息或者转换不成功时,必须进行强制转换。
- 用户定义的转换:可以定义一些特殊的方法来执行用户定义的转换,从而使不具有基类-派生类关系的自定义类型之间可以显式和隐式转换
- 使用帮助程序类的转换:若要在不兼容的类型之间进行转换,例如在整数与System.DateTime 对象之间转换,或者在十六进制字符串与字节数组之间转换,则可以使用 System.BitConverter 类、System.Convert 类和内置数值类型的Parse方法,例如 Int32.Parse。
具体说明
隐式转换
- 对于内置数值类型,容量小的变量中的值转换成容量大的变量中的值,此时不会出现数据截断和四舍五入而导致的信息丢失的情况;
- 派生类到基类的转换;
- 实现接口的类到接口的转换。
示例:
int num = 2147483647;long bigNum = num;//隐式转换
class Programe{ static void Main() { var classBase=new ClassBase(); var classChild=new ClassChild(); classBase=classChild;//隐式转换 }}class ClassChild:ClassBase{}class ClassBase{}
class Programe{ static void Main() { IDoSometing doSomething; var classChild=new ClassChild(); doSomething=classChild;//隐式转换 }}class ClassChild:IDoSometing{ //成员声明和实现}interface IDoSometing{ //成员声明 }
显示转换
- 对于内置数值类型,容量大的变量中的值转换成容量小的变量中的值,此时会出现数据截断和四舍五入而导致的信息丢失的情况;
- 基类到派生类的转换;
- 接口到实现接口的类的转换。
示例:
class Test { static void Main() { double x = 1234.7; int a; // Cast double to int. a = (int)x; System.Console.WriteLine(a); } } // Output: 1234
运行时的类型转换异常
在某些引用类型转换中,编译器无法确定强制转换是否会有效。 正确进行编译的强制转换操作有可能在运行时失败。 如下面的示例所示,类型强制转换在运行时失败将导致引发 InvalidCastException。
using System; class Animal { public void Eat() { Console.WriteLine("Eating."); } public override string ToString() { return "I am an animal."; } } class Reptile : Animal { } class Mammal : Animal { } class UnSafeCast { static void Main() { Test(new Mammal()); // Keep the console window open in debug mode. System.Console.WriteLine("Press any key to exit."); System.Console.ReadKey(); } static void Test(Animal a) { // Cause InvalidCastException at run time // because Mammal is not convertible to Reptile. Reptile r = (Reptile)a; } }
使用 as 和 is 运算符安全地进行强制转换
由于对象是多态的,因此基类类型的变量可以保存派生类型。 若要访问派生类型的方法,需要将值强制转换回该派生类型。 不过,在这些情况下,如果只尝试进行简单的强制转换,会导致引发 InvalidCastException 的风险。 这就是 C# 提供 is 和 as 运算符的原因。 您可以使用这两个运算符来测试强制转换是否会成功,而没有引发异常的风险。 通常,as 运算符更高效一些,因为如果可以成功进行强制转换,它会实际返回强制转换值。 而 is 运算符只返回一个布尔值。 因此,如果只想确定对象的类型,而无需对它进行实际强制转换,则可以使用 is 运算符。
class SafeCasting { class Animal { public void Eat() { Console.WriteLine("Eating."); } public override string ToString() { return "I am an animal."; } } class Mammal : Animal { } class Giraffe : Mammal { } class SuperNova { } static void Main() { SafeCasting app = new SafeCasting(); // Use the is operator to verify the type. // before performing a cast. Giraffe g = new Giraffe(); app.UseIsOperator(g); // Use the as operator and test for null // before referencing the variable. app.UseAsOperator(g); // Use the as operator to test // an incompatible type. SuperNova sn = new SuperNova(); app.UseAsOperator(sn); // Use the as operator with a value type. // Note the implicit conversion to int? in // the method body. int i = 5; app.UseAsWithNullable(i); double d = 9.78654; app.UseAsWithNullable(d); // Keep the console window open in debug mode. System.Console.WriteLine("Press any key to exit."); System.Console.ReadKey(); } void UseIsOperator(Animal a) { if (a is Mammal) { Mammal m = (Mammal)a; m.Eat(); } } void UseAsOperator(object o) { Mammal m = o as Mammal; if (m != null) { Console.WriteLine(m.ToString()); } else { Console.WriteLine("{0} is not a Mammal", o.GetType().Name); } } void UseAsWithNullable(System.ValueType val) { int? j = val as int?; if (j != null) { Console.WriteLine(j); } else { Console.WriteLine("Could not convert " + val.ToString()); } } }
1 0
- C# 类型转换(知识要点归纳总结)
- C# 接口(知识要点归纳总结)
- C# 类继承(知识要点归纳总结)
- C# 访问修饰符(知识要点归纳总结)
- C# 抽象类(知识要点归纳总结)
- C# 接口和抽象类的区别和使用场合(知识要点归纳总结)
- C++知识要点整理10:类型转换
- 数据结构要点归纳总结(转)
- C#类型转换总结
- C#类型转换总结
- C#类型转换总结
- C#类型转换总结
- c#类型转换总结
- C++ 类型转换归纳
- C#语法小知识(二十四)自定义类型转换
- C#类型转换总结(一)
- C# WPF知识要点,工程项目中应用总结!
- 前端JS知识要点总结(1)
- Elasticsearch 自动补齐建议
- (18)Java学习笔记——多线程01
- 数据算法之快速排序(quickSort)的Java实现
- DriveInfo.GetDrives使用错误备忘
- Win10 Python 2.7.7 安装Scrapy
- C# 类型转换(知识要点归纳总结)
- 基于Ubuntu系统搭建以太坊go-ethereum源码的开发环境
- Android studio————Gradle基础语法
- hibernate与mybatis的区别
- CListBox中怎么样默认选中第一行的数据?
- angular 中的 DOM 操作
- CSS3盒相关样式读后感
- opencv学习笔记之Mat
- Android 从源码的角度带你完全解析AsyncTask