【Unity】Unity C#基础(二)类型转换、拆装箱

文章目录

  • 类型转换
    • - 隐式转换
    • - 显式转换
    • - 通过方法进行类型转换
    • - 使用AS操作符转换
  • 拆装箱
    • - 装箱
    • - 拆箱
    • - 建议


类型转换

- 隐式转换

这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。

int a = 10;
double b = a;//隐式转换

- 显式转换

显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。

double c = 10.5;
int d = (int)c;//显示转换,精度丢失,结果为10

提醒:

  1. 显式转换可能会导致错误。进行这种转换时编译器将对转换进行溢出检测。如果有溢出说明转换失败,就表明源类型不是一个合法的目标类型。无法进行类型转换。
  2. 强制类型转换会造成数据丢失,如上面的例子中,最终得到的d值为10。

- 通过方法进行类型转换

  1. 使用ToString()方法。所有类型都继承了Object基类,所以都有ToString()这个方法(转化成字符串的方法)。

  2. 通过int.Parse()方法转换,参数类型只支持string类型。注意:使用该方法转换时string的值不能为为NULL,不然无法通过转换;另外string类型参数也只能是各种整型,不能是浮点型,不然也无法通过转换 (例如int.Parse(“2.0”)就无法通过转换)。

int i;
i = int.Parse("100");
  1. 通过int.TryParse()方法转换,该转换方法与int.Parse()转换方法类似,不同点在于int.Parse()方法无法转换成功的情况该方法能正常执行并返回0。也就是说int.TryParse()方法比int.Parse()方法多了一个异常处理,如果出现异常则返回false,并且将输出参数返回0。
int i;
string s = null;
int.TryParse(s,out i);
  1. 通过Convert类进行转换,Convert类中提供了很多转换的方法。使用这些方法的前提是能将需要转换的对象转换成相应的类型,如果不能转换则会报格式不对的错误。注意:使用Convert.ToInt32(double value)时,如果 value 为两个整数中间的数字,则返回二者中的偶数;即 4.5 转换为 4,而 5.5 转换为 6。

  2. 实现自己的转换,通过继承接口IConventible或者TypeConventer类,从而实现自己的转换。

- 使用AS操作符转换

使用AS操作符转换,但是AS只能用于引用类型和可为空的类型。使用as有很多好处,当无法进行类型转换时,会将对象赋值为NULL,避免类型转换时报错或是出异常。C#抛出异常在进行捕获异常并进行处理是很消耗资源的,如果只是将对象赋值为NULL的话是几乎不消耗资源的(消耗很小的资源)。

public static void Main() {
    Person p1 = new Person();
    Student p2 = new Student();
    // 将子类对象赋值给父类对象(可行)
    Person p3 = new Student();
	// 将父类对象赋值给子类对象(不可行)
	// Student p4 = new Person();编译报错
	
	// 子类对象p3转子类对象p5(可行)
	Student p5 = p3 as Student;
	
	// 父类对象p1转子类对象p6(编译通过,但不可行),p6为null
	Student p6 = p1 as Student;
	
	// 子类对象p2转其他子类对象p7(编译通过,但不可行),p7为null
	Teacher p7 = p3 as Teacher;
	
	// 可以访问什么成员,取决于引用了什么类型
}

内存使用情况如图:
【Unity】Unity C#基础(二)类型转换、拆装箱_第1张图片

拆装箱

装箱和拆箱在值类型和引用类型之间架起了一座桥梁,使得任何 value-type 的值都可以转换为 object 类型的值,反过来转换也可以。

int a = 1;
Object obj = a;    // 装箱:值类型变成引用型。
int b = (int)obj;  // 拆箱:引用型变成值类型。

- 装箱

装箱是指将一个值类型的数据隐式地转换成一个对象类型(object)的数据。执行装箱操作时不可避免的要在堆上申请内存空间,并将堆栈上的值类型数据复制到申请的堆内存空间上,这肯定是要消耗内存和cpu资源的。注意:在执行装箱转换时,也可以使用显式转换。
装箱机制

  1. 在堆中开辟内存空间。
  2. 把a的值复制到堆中。
  3. 把堆中的地址给obj。
    【Unity】Unity C#基础(二)类型转换、拆装箱_第2张图片

- 拆箱

拆箱是指将一个对象类型的数据显式地转换成一个值类型数据。拆箱过程是装箱的逆过程,是将存储在堆上的引用类型值转换为值类型并赋给值类型变量。拆箱操作分为两步:一是检查对象实例,确保它是给定值类型的一个装箱值;而是将该值从实例复制到值类型变量中。
拆箱机制

  1. 判断类型是否一致。
  2. 把obj在堆中的值的地址给b。

- 建议

  1. 装箱和拆箱都是要消耗内存和cpu资源的,也就造成效率降低,所以要尽量避免使用
  2. 形参为Object,实参为值类型,则会装箱,可通过重载和泛型避免。

更多内容请查看总目录【Unity】Unity学习笔记目录整理

你可能感兴趣的:(Unity,Unity基础功能,C#,unity,c#,游戏开发,游戏引擎)