转换
- C#中,互相兼容的类型实例间可以相互转换
- 转换总是从现有的值创建出来一个新的值
- 显式转换和隐式转换
- 编译器不能保证转换成功
- 信息可能丢失
注意
- 值类型包括所有的内置类型(数值、字符、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 }
<a name="BsvzM"></a>## 值类型的开销- 值类型的实例所占的内存 = 字段需要内存的总和- CLR会把类型内的字段大小设置为实际大小的整数倍```csharppublic struct A{byte b; // 1 bytelong l; // 8 byte}
引用类型

- 给引用类型的变量赋值:复制引用,而不是对象实例
- 允许多个变量引用一个对象 ```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 }
<a name="CVCyZ"></a># <a name="vFrMS"></a>## 引用类型的开销- 需要为引用和对象单独分配内存- 对象所占内存 = 其字段所占内存总和 + 额外的管理开销(最少8字节)- 每个对象的引用需要额外的4或8个字节(根据32位系统还是64位系统)<a name="dQbee"></a># 数值类型---<a name="D8GgV"></a>## 数值Literal`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;` 指数形式<a name="gfqQo"></a>## 数值Literal的类型推断- 包含小数点或是指数形式展现,为double类型- 否则为以下其中一个能容纳数值的类型:int、uint、long、ulong<a name="JGdcC"></a>## Check用来告诉CLR,如果整型表达式超出了该类型极限,就会抛出OverflowException```csharpint a = 1000000;int b = 1000000;int c = checked(a * b);checked{int d = a * b;}
注意
8、16位数值没有操作符
short x = 1;short y = 2;short z = x + y; //报错,此时x以及y隐式转换为int类型short z = (short)(x + y)//显式转换
字符串
逐字字符串 verbatim string literal(string s = @””)
- @做前缀 (在双引号外面)
- 不支持转义字符
- 支持多行字符串
想使用双引号需要输入两次双引号
string a1 = "\\\\server\\fileshare\\helloworld.cs";string a2 = @"\\server\fileshare\helloworld.cs";\\两者输出相同
字符串插值 string interpolation(string s = $””)
C#6之后才有的语法糖
- $做前缀(在双引号外面)
- 可以包含表达式
int x = 4; string s = $"A square has {x} sides";
- 想要输入{,需要输入两次{
视频
点击查看【bilibili】
