C#类型转换
C# 类型转换
类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型。在 C# 中,类型铸造有两种形式:
- 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
- 显式类型转换 - 显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。
隐式类型转换就是系统自己进行的转换,不需要特地去转换
double d = 5.18; int i = 1; //d是double类型,要与int类型的i相加,系统会将i隐式转换成double类型,结果也是double类型 //输出6.18 Console.WriteLine(d+i); //这里不会丢失精度 所以不需要显式转换而是使用隐式转换 d=i; Console.WriteLine(d);
显示类型转换就是需要手动标识转换的类型,并且会丢失精度
//强制类型转换,丢失精度 d = 6.18; i = (int)d; //输出6 Console.WriteLine(i);
类型转换使用场景
- 父类引用需要调用子类特有的方法
- 图个方便或特殊需要
向下类型转换
{ Pen p = new MarkerPen(); p.draw(); //父类向下转型使用子类方法 //即使是父类也应该确保引用指向的是要转换的子类 MarkerPen mp = (MarkerPen)p; mp.setColor("White"); mp.drawColor(); } //MarkerPen继承于Pen class MarkerPen : Pen { private String color = "red"; public void setColor(String c) { this.color = c; } public void drawColor() { Console.WriteLine($"I draw in {color} color."); } } class Pen { public void draw() { Console.WriteLine("I draw in black color."); } }
代码中包含了Pen类和继承于Pen类的MarkerPen类
其中
Pen p = new MarkerPen();
声明了父类的引用指向子类的实现类
但是却不能使用子类的方法(一杆马克笔确实是一支笔,但他只是一支笔的话便无法画出颜色)
所以需要向下强制转换类型才能使用子类方法(马克笔是马克笔的时候便能画出颜色)
也就是说是谁的引用便能调用谁的方法
取整
这里这是举一个强制转换的使用例子
float f= 6.18f; //会直接输出float的整数部分6 算是利用了丢失精度这一点 Console.WriteLine((int)f);
C# 类型转换方法
C# 提供了下列内置的类型转换方法:
序号 | 方法 & 描述 |
---|---|
1 | ToBoolean 如果可能的话,把类型转换为布尔型。 |
2 | ToByte 把类型转换为字节类型。 |
3 | ToChar 如果可能的话,把类型转换为单个 Unicode 字符类型。 |
4 | ToDateTime 把类型(整数或字符串类型)转换为 日期-时间 结构。 |
5 | ToDecimal 把浮点型或整数类型转换为十进制类型。 |
6 | ToDouble 把类型转换为双精度浮点型。 |
7 | ToInt16 把类型转换为 16 位整数类型。 |
8 | ToInt32 把类型转换为 32 位整数类型。 |
9 | ToInt64 把类型转换为 64 位整数类型。 |
10 | ToSbyte 把类型转换为有符号字节类型。 |
11 | ToSingle 把类型转换为小浮点数类型。 |
12 | ToString 把类型转换为字符串类型。 |
13 | ToType 把类型转换为指定类型。 |
14 | ToUInt16 把类型转换为 16 位无符号整数类型。 |
15 | ToUInt32 把类型转换为 32 位无符号整数类型。 |
16 | ToUInt64 把类型转换为 64 位无符号整数类型。 |
下面的实例把不同值的类型转换为字符串类型:
实例
namespace TypeConversionApplication { class StringConversion { static void Main(string[] args) { int i = 75; float f = 53.005f; double d = 2345.7652; bool b = true; Console.WriteLine(i.ToString()); Console.WriteLine(f.ToString()); Console.WriteLine(d.ToString()); Console.WriteLine(b.ToString()); Console.ReadKey(); } } }
当上面的代码被编译和执行时,它会产生下列结果:
75 53.005 2345.7652 True