转换


  • C#中,互相兼容的类型实例间可以相互转换
  • 转换总是从现有的值创建出来一个新的值
  • 显式转换和隐式转换
    • 隐式转换是自动的
    • 显式转换需要手动
      1. int a = 123;
      2. long y = a; //显式转换
      3. short z = (short) y;//隐式转换

      隐式转换

      隐式转换的两个必要条件:
  1. 编译器可以保证转换成功
  2. 信息不会丢失

    显式转换

    显式转换的条件(任意一个成立):
  • 编译器不能保证转换成功
  • 信息可能丢失

注意

  • 浮点型转化为整型,小数部分是被截断的,没有输入
  • 大整数隐式转换为浮点类型之后,会保证量级不变,偶尔会丢失精度

    值类型和引用类型


  • 值类型包括所有的内置类型(数值、字符、bool)和自定义的struct和enum
  • 引用类型包含所有的class、数组、delegate、interface以及字符串
  • 两者的区别在于处理内存的方式

    值类型

  • 值类型实例的复制动作总是复制了该实例 ```csharp public struct Point { public int x; public int y; }

static void Main() { Point p1 = new Point(); p1.x = 7; Point p2 = p1; //p1.x = 7 p2.x = 7 p1.x = 9; //p1.x = 9 p2.x = 7 }

  1. <a name="BsvzM"></a>
  2. ## 值类型的开销
  3. - 值类型的实例所占的内存 = 字段需要内存的总和
  4. - CLR会把类型内的字段大小设置为实际大小的整数倍
  5. ```csharp
  6. public struct A
  7. {
  8. byte b; // 1 byte
  9. long l; // 8 byte
  10. }

引用类型

QQ截图20200523211917.png

  • 给引用类型的变量赋值:复制引用,而不是对象实例
  • 允许多个变量引用一个对象 ```csharp public class Point { public int x; public int y; }

static void Main() { Point p1 = new Point(); p1.x = 7; Point p2 = p1; //p1.x = 7 p2.x = 7 p1.x = 9; //p1.x = 9 p2.x = 9 }

  1. <a name="CVCyZ"></a>
  2. # ![QQ截图20200523212211.png](https://cdn.nlark.com/yuque/0/2020/png/1244448/1590240137956-f384240f-5ebc-4945-95b9-2224e6e9ba94.png#align=left&display=inline&height=362&margin=%5Bobject%20Object%5D&name=QQ%E6%88%AA%E5%9B%BE20200523212211.png&originHeight=362&originWidth=671&size=29305&status=done&style=none&width=671)
  3. <a name="vFrMS"></a>
  4. ## 引用类型的开销
  5. - 需要为引用和对象单独分配内存
  6. - 对象所占内存 = 其字段所占内存总和 + 额外的管理开销(最少8字节)
  7. - 每个对象的引用需要额外的4或8个字节(根据32位系统还是64位系统)
  8. <a name="dQbee"></a>
  9. # 数值类型
  10. ---
  11. ![QQ截图20200523213611.png](https://cdn.nlark.com/yuque/0/2020/png/1244448/1590240990072-b11fd077-2cfc-4df7-898f-fb61020980c9.png#align=left&display=inline&height=609&margin=%5Bobject%20Object%5D&name=QQ%E6%88%AA%E5%9B%BE20200523213611.png&originHeight=609&originWidth=1139&size=132253&status=done&style=none&width=1139)
  12. <a name="D8GgV"></a>
  13. ## 数值Literal
  14. `int x = 127; long y = 0x7F;` <br />`int million = 1_000_000;` 从C#7开始支持 数值Literal使用下划线<br />`var b = 0b1010_1011_1100;` 二进制 <br />`double million = 1E06;` 指数形式
  15. <a name="gfqQo"></a>
  16. ## 数值Literal的类型推断
  17. - 包含小数点或是指数形式展现,为double类型
  18. - 否则为以下其中一个能容纳数值的类型:int、uint、long、ulong
  19. <a name="JGdcC"></a>
  20. ## Check
  21. 用来告诉CLR,如果整型表达式超出了该类型极限,就会抛出OverflowException
  22. ```csharp
  23. int a = 1000000;
  24. int b = 1000000;
  25. int c = checked(a * b);
  26. checked
  27. {
  28. int d = a * b;
  29. }

注意

8、16位数值没有操作符

  1. short x = 1;
  2. short y = 2;
  3. short z = x + y; //报错,此时x以及y隐式转换为int类型
  4. short z = (short)(x + y)//显式转换

字符串


逐字字符串 verbatim string literal(string s = @””)

  • @做前缀 (在双引号外面)
  • 不支持转义字符
  • 支持多行字符串
  • 想使用双引号需要输入两次双引号

    1. string a1 = "\\\\server\\fileshare\\helloworld.cs";
    2. string a2 = @"\\server\fileshare\helloworld.cs";
    3. \\两者输出相同

    字符串插值 string interpolation(string s = $””)

  • C#6之后才有的语法糖

  • $做前缀(在双引号外面)
  • 可以包含表达式
    • int x = 4; string s = $"A square has {x} sides";
  • 想要输入{,需要输入两次{

    视频

    点击查看【bilibili】