C# 入门(12) 转换(conversion)、装箱拆箱、is 操作符、as 操作符

22 篇文章 1 订阅
19 篇文章 5 订阅

#C#的转换

参考书籍: 《C#图解教程》
【《Effective C#》提炼总结】提高Unity中C#代码质量的22条准则
【《Effective C#》提炼总结】提高Unity中C#代码质量的22条准则

转换

推荐使用 is 或 as 操作符而不是强制类型转换。


##checked和unchecked运算符
  这两个运算符是用来检测溢出的。表达式括号内是表达式,不能放方法。

  • checked运算符检测是否转换溢出,溢出的话会抛出OverflowException异常。
  • unchecked运算符这会忽略溢出,直接转换。

##checked和unchecked语句
  这个和checked和unchecked运算符的功能是一样的,只不过是用花括号,就可以不局限于一条表达式了。两种语句可以任意嵌套。

byte sb;
ushort sh = 2000;

unchecked
{
	sb = (byte)sh;
	Console.WriteLine("sb: {0}",sb);      //输出208

	checked
	{
		sb = (byte)sh;                    //抛出异常
		Console.WriteLine("sb: {0}",sb); 
	}
}

##引用的转换
  对于基类引用转换到衍生类引用必须两个引用都先初始化。即便基类不初始化,或为null,可以转换成子类,但是不安全的。所以尽量对引用先初始化。


##装箱(boxing)和拆箱(unboxing)
  装箱是把值类型复制到一个引用类型里。可以转换下图的类型。
装箱

拆箱就是把原来的引用类型强制转换成值类型。转换失败会抛出InvalidCastException异常。

  • 一种最普通的场景是,调用一个含类型为Object的参数的方法,该Object可支持任意为类型,以便通用。当你需要将一个值类型(如Int32)传入时,需要装箱。
  • 另一种用法是,一个非泛型的容器,同样是为了保证通用,而将元素类型定义为Object。于是,要将值类型数据加入容器时,需要装箱。

##用户自定义转换
  这东西我觉得除非自己想重新封装一个数据类型可以用一下,但是可能会让代码看起来没那么清晰。

用户自定义转换一些重要约束:

  • 只可以为类和结构定义用户自定义转换。
  • 不能重定义标准隐式转换或显示转换。
  • 对于源类型S和目标类型T,有下面几个要求
    • S和T必须是不同类型。
    • S和T没有直接或间接继承关联。
    • S和T不是接口或object。
    • 转换运算符必须是S或T的成员。

对于多步用户自定义转换,个人更不推荐用了,我觉得这会让代码看得很难理解,见《C#图解教程》P304


##is操作符

  • 用于判断表达式左边的类型是否可以转换成右边的类型。这就可以安全的进行转换了。
  • 只能用于引用转换,装箱,拆箱转换,不能用于用户自定义转换。

##as操作符

  • 用于强制转换,相比传统强制转换更安全,高效。转换失败不会抛异常,而是返回null。
  • 只能用于引用类型或者可空类型。对值类型是无效的,这时用is和强制转换配合。
  • 同is运算符,只能用于引用,装箱,拆箱转换。
  • 仅当不能使用as进行转换时,才应该使用is操作符。否则is就是多余的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值