02011701 转换

02011701 转换

1. 什么是转换

  • 转换(Conversion)是接受一个类型的值并将它用作另一个类型的等价值的过程。
    • 转换后的值应和源值一样,但其类型为目标类型。
short var1 = 5;
sbyte var2 = 10;
var2 = (sbyte)var1; // @1 强制转换表达式,把var1的值转换为sbyte类型。

说明:
1. var1是short类型的16位有符号整数,初始值为5。
2. var2是sbyte类型的8位有符号整数,初始值为10。
3. 在@1处,把var1赋值给var2。
3.1 由于它们是两种不同的类型,在进行赋值之前,var1的值必须先转换为与var2类型相同的值。
3.2 通过强制类型转换表达式来实现。
4. var1在转换之后,var1的类型和值本身都没有改变。尽管称之为转换,但知识代表源值作为目标类型的值来使用,而不是源值转换为目标类型。

2. 隐式转换

  • 有些类型的转换不会丢失数据或精度。例如:将8位的值转换为16位是非常容易的,而且不会丢失数据。语言会自动做这些转换,这叫做隐式转换。

3. 显式转换

  • 如果要把短类型转换为长类型,让长类型保存短类的所有位很简单。然而,在其它情况下,目标类型也许无法再不损失数据的情况下容纳源值。
  • 假设我们希望把ushort值转换为byte,有如下注意事项。
    • ushort可以保存0 ~ 65535的值。
    • byte只能保存0 ~ 255的值。
    • 只要希望转换的ushort值小于256,就不会损失数据。
    • 如果大于256,最高位的数据将会丢失(溢出),从而产生其它值。

4. 强制转换

  • 对于预定义类型,C#会自动将一个数据类型转换为另一个数据类型,但这只是针对那些从源类型转换为目标类型时不会发生数据丢失的情况。
    • 如果源类型的任意值在被转换成目标类型时会丢失值,那么C#是不会提供者两种类型的自动换行的。
  • 如果希望这样的类型进行转换,必须使用显式转换。这叫做强制转换表达式。
// 强制转换表达式语法格式
目标类型
   ↓
(sbyte) var1;
         ↑
      源表达式

注意,如果使用强制转换表达式,就意味着要承担执行该操作可能引起的丢失数据的后果。

5. 转换的类型

图片链接丢失
转换的类型
  • 在C#中有很多标准的、预定义的用于数字和引用类型的转换。
    • 除了标准转换,还可以为用户自定义类型定义隐式转换和显式转换。
  • 装箱 → 装箱是C#预定义的的转换类型,它可以将任何值类型转换为如下类型。
    • object类型
    • System.ValueType类型
  • 拆箱 → 拆箱可以将一个装箱的值转换为原始类型。

6. 数字的转换

图片链接丢失
数字转换
  • 任何数字类型都可以转换为其它数字类型,这其中一些转换是隐式的,而另外一些转换必须是显式的。
6.1 隐式和显式数字转换
  • 如上图,如果沿着箭头存在一条从源类型到目标类型的路径,则存在从源类型到目标类型的隐式转换。
  • 如上图,如果不存在从源类型到目标类型的路径的数字转换,一定是显式转换。
6.2 隐式数字转换的理解
图片链接丢失
数字转换
  • 占据较少位的数字类型可以隐式转换为占据较多位的数字类型。
6.3 溢出检测上下文
  • 显式转换可能会丢失数据并且不能再目标类型中相等的表示源值。
  • 对于整数类型,C#允许我们选择运行时是否应该在进行类型转换时检测结果溢出,可以通过checked运算符和checked语句来实现。

略(后续用到一部分,补充一部分)

7. is运算符

  • 有些转换是不成功的,并且会在运行时抛出InvalidCastException异常。我们可以使用is运算符来检查转换是否会成功完成,从而避免盲目尝试转换。
Expr is TargetType // 返回bool值。

说明:如果Expr可以通过如下方式成功转换为目标类型,则运算符返回true。

注意,is运算符只可以用于引用转换、装箱转换、拆箱转换,不能用于用户自定义转换。

8 as运算符

  • as运算符和强制转换运算符类似,知识它不抛出异常。如果转换失败,它返回null而不是异常。
Expr as TargetType // 返回引用

说明:
1. Expr是源表达式
2. TargetType是目标类型,它必须是引用类型。

注意,由于as运算符返回引用表达式,它可以用作赋值操作中的源。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
class Employee : Person {}
class Person
{
    public string Name = "Anonymous";
    public int Age = 25;
}

class Program
{
    Employee bill = new Employee();
    Person p;
    
    p = bill as Person;
    if(p != null)
    {
        Console.WriteLine($"Person Info: {p.Name}, {p.Age}");
    }
}

注意,as运算符和is类似,as运算符只能用于引用转换和装箱转换,不能用于用户自定义转换或到值类型的转换。

结尾

书籍:C#图解教程

著:【美】丹尼尔 · 索利斯;卡尔 · 施罗坦博尔

译:窦衍森;姚琪琳

ISBN:978-7-115-51918-4

版次:第5版

发行:人民邮电出版社

※敬请购买正版书籍,侵删请联系85863947@qq.com※

※本文章为看书或查阅资料而总结的笔记,仅供参考,如有错误请留言指正,谢谢!※

posted @ 2025-08-17 09:55  qinway  阅读(10)  评论(0)    收藏  举报