第四单元 类型转换
类型转换分为:强制转换 (显示转换)与 隐式转换
按内存分类:装箱,拆箱
1. 隐式转换
对于内置数值类型,如果要存储的值无需截断或四舍五入即可适应变量,则可以进行隐式转换。 对于整型类型,这意味着源类型的范围是目标类型范围的正确子集。 例如,
int num = 30; long bigNum = num; // 存在隐式转换 int==>long doubble d = 10; // int==>double string str = "10"; string result = str+num; // 会先将num转换为string,然后再进行字符串拼接,result= "1030" sbyte a = 127; sbyte b = 127; // b = b +a; // 报错,因为溢出 b += a; // 编译通过,结果 154,b 变量 隐式转换int
2. 强制转换
如果进行转换可能会导致信息丢失,则编译器会要求执行显式转换,显式转换也称为强制转换。 强制转换是显式告知编译器以下信息的一种方式:你打算进行转换且你知道可能会发生数据丢失,或者你知道强制转换有可能在运行时失败。 若要执行强制转换,请在要转换的值或变量前面的括号中指定要强制转换到的类型。 下面的程序将
double x = 1234.7; int a; // double ==> int. a = (int)x; System.Console.WriteLine(a); double x = 1234.7; int a; // double ==> int. a = int.Parse(x); System.Console.WriteLine(a); double x = 1234.7; int a; // double ==> int. a = Convert.ToInt32(x); System.Console.WriteLine(a); int a=30; // 转换为字符串 string s1 = a.ToString(); string s2 = Convert.ToString(a);
Convert 类 很强大
-
Convert.ToInt32()
: 转换为int -
Convert.ToInt64()
: 转换为long -
Convert.ToString()
: 转换为String -
Convert.ToByte()
: 转换为byte -
Convert.ToChar()
: 转换为Char字符 -
......
引用类型之间的转换
class Program { static void Main(string[] args) { // 引用类型如果没有赋值,默认值是null object per = new Person(); // 创建一个类对象 Person person1 = per as Person; // 使用 as 进行强制转换 Person person2 = (Person) per;// 强制转换 } } // 声明一个类 class Person { }
3. 装箱与拆箱
装箱 就是把“值类型”转换成“引用类型”(Object);
拆箱 就是把“引用类型”转换成“值类型”;
int i = 3; //分配在栈上 //装箱 boxing object o = i;//隐式装箱操作,int i 在堆上 object b = (object)i;//显示装箱操作 //拆箱 unboxing int j = (int)o;//显示拆箱(将对象o拆箱为int类型) //int k = b;//error!!, 不能隐式拆箱
拆箱 的操作包括
1,检查对象实例,以却确保它是给定值类型的装箱值。
2,将该值从实例复制到值类型变量中。
下面来看看这个例子:
int i=0; System.Object obj=i; Console.WriteLine(i+","+(int)obj);
其中共发生了3次装箱和一次拆箱!^_^,看出来了吧?! 第一次是将i装箱,第2次是输出的时候将i转换成string类型,而string类型为引用类型,即又是装箱,第三次装箱就是(int)obj的转换成string类型,装箱! 拆箱就是(int)obj,将obj拆箱!!
拆箱与拆箱都会对内存进行操作,对性能有一定的影响,在日常编程开发中应尽量避免。
4. 作业
-
从控制台输入一个数字字符串,强制转换为整形
-
从控制台输入三角形的底和高,计算三角形的面积。
-
从控制台输入一个数字,然后左移1位,输出它的二进制结果。
-
请指出哪些语句包含了装箱, 哪些属于拆箱
object o = 10; object obj = "30"; double d = 20; int a = ++d; string s = "15" + 15; int b = Convert.ToInt32(s); object obj2 = a.ToString(); long a = Convert.ToInt64(10.2m);
视频教程: