-
字符串不可变
所有string类型的数据,不管是不是字符串字面值,都是不可变的。也就是说,不能修改变量最初引用的数据,只能重新赋值,让它指向内存中的新位置。 -
托管执行和CLI
处理器不能直接解释程序集。程序集是公共中间语言(Common Intermediate Language, CLI)又称中间语言(IL)或Microsoft IL (MSIL)。C#编译器将C#源代码文件转换成中间语言。
为了将CIL代码转换成处理器能理解的机器码,还要完成一个额外的步骤(通常在运行时进行)。该步骤涉及C#程序执行的一个重要元素:VES(Virtual Execution System,虚拟执行系统)。VES也称为运行时(runtime)。它根据具体需要来编译CIL代码,这个过程称为即时编译或JIT编译(just-in-time compilation)。
如果代码在像“运行时”这样的一个“代理”的上下文中执行,就称为托管代码(managed code),在“运行时”的控制下执行的过程称为托管执行(managed execution)。之所以称为“托管”,是因为“运行时”管理着诸如内存分配、安全性和JIT编译等方面,从而控制了主要的程序行为。
执行时不需要“运行时”的代码称为本机代码(native code)或非托管代码(unmanaged code)。 -
C#的数据类型
C#有大量类型,而且可合并类型来创建新类型。但C#有几种类型非常简单,是其他所有类型的基础,它们称为预定义类型(predefined type)或基元类型(primitive type)。
C#语言的基元类型包括八种整数类型、两种用于科学计算的二进制浮点类型、一种用于金融计算的十进制浮点类型、一种布尔类型以及一种字符类型。 -
八种整数类型
类型 | 大小 | 范围 | BCL名称 | 后缀 |
---|---|---|---|---|
sbyte | 8位 | -27~27-1 | System.SByte | |
byte | 8位 | 0~28-1 | Sytem.Byte | |
short | 16位 | -215~215-1 | System.Int16 | |
ushort | 16位 | 0~216-1 | System.UInt16 | |
int | 32位 | -231~231-1 | System.Int32 | |
uint | 32位 | 0~232-1 | System.UInt32 | U或u |
long | 64位 | -263~263-1 | System.Int64 | L或l |
ulong | 64位 | 0~264-1 | System.UInt64 | UL或ul |
两种用于科学计算的二进制浮点类型(了解完浮点数存储回来补全)
类型 | 大小 | 范围 | BCL名称 | 有效数位 | 后缀 |
---|---|---|---|---|---|
float | 32位 | System.Single | F或f | ||
double | 64 | System.Double | D或d |
一种用于金融计算的十进制浮点类型(了解完浮点数存储回来补全)
类型 | 大小 | 范围 | BCL名称 | 有效数位 | 后缀 |
---|---|---|---|---|---|
decimal | 128位 | System.Decimal | M或m |
- 一种布尔类型
类型 | 大小 | 取值 | BCL名称 |
---|---|---|---|
bool | 一个字节 | true、false | System.Boolean |
- 一种字符类型
类型 | 大小 | 取值 | BCL名称 |
---|---|---|---|
char | 16位 | 0~216-1 | System.Char |
取值范围对应于Unicode字符集。
- 字符串
- 零或多个字符的有限序列称为字符串。
- string是一种“不可变”类型。
- 逐字字符串,符号@。以@开头的字符串唯一支持的转义序列是“”,代表一个双引号,不会终止字符串。
- C#不自动连接字符串字面值。必须用+操作符连接(但如果编译器能在编译时计算结果,最终的CIL代码将包含连接好的字符串)。
- 假如同一字符串字面值在程序集中多次出现,编译器在程序集中只定义字符串一次,且所有变量都指向它。这样一来,假如在代码中多处插入包含大量字符的同一字符串字面值,最终的程序集只反映其中一个的大小。
- 字符串插值,符号$。逐字和插值可组合使用,但$要在@之前。字符串插值是调用string.Format()方法的语法糖。