【IT168 技术讲解】处理器不能直接解释一个程序集.程序集采用的是另一种语言,即公共中间语言(Common Intermediate Language, CIL),或者简称为中间语言(IL).
注意 CIL的另一种说法即MSIL, 即Microsoft IL.
C#编辑器只是将C#源代码文件转换成为CIL.为了将CIL代码转换成处理器能够理解的机器码,还要执行一个额外的步骤(该步骤通常是在执行时完成的).这个步骤涉及C#执行中的一个重要元素:VES(Virtual Execution System,虚拟执行系统).VES也被人称为“运行时”,它根据需要来编译CIL代码,这个过程称为即时编译或者JIT编译(just-in-time compilation).
托管代码(managed code) :代码在"运行时"这样一个"代理"的上下文中执行.
托管执行(managed execution):在"运行时"的控制下执行的过程.
非托管代码(unmanaged code):在执行过程中不需要"运行时"的代码.
CLI(common Languageinfrastructure,公共语言基础结构)
VES规范被包含在一个包容面更广的规范中,即CLI(common Languageinfrastructure,公共语言基础结构)规范.作为一个国际行标准,CLI包含了以下几方面的规范.
VES或"运行时".
CIL
为语言互操作性提供支持的一个类型系统,成为CTS(Common Type System,公共类型系统).
如何编写能通过各种CLI兼容语言访问的库的指导原则,这部分内容具体放在公共语言规范(Common Language Specification CLS)中.
市各种服务能被CLI(包括程序集的布局或文件格式规范)识别的元数据
一个公共编程框架,称为基类库(Base Class Library, BCL),所有语言的开发者都能利用它.
语言互操作性:不同源语言之间的互操作性.语言编译器将每一种源语言转换成相同的中间语言(CIL),从而实现这种互操作性.
类型安全:检查类型间的转换,确保只有相互兼容的类型才会进行转换.这有助于防止发生缓冲区溢出.造成安全问题的一个主要诱因.
代码访问安全性:程序集开发者的代码有权在计算机上执行的证明
垃圾回收
平台可移植性
BCL
基本数据类型
C#数据类型大体有:基本数据类型(整数/浮点/decimal类型)、布尔类型、字符类型、字符串类型
C#共有8种整数类型,可以选择恰当的一种数据类型来存放数据,避免浪费资源. 下面对每种整数类型进行总结:
C#基本字符串类型为string(C#中类型区分大小写),BCL名称为System.string.
在这里讲一点string比较深入的内容.
length属性
length()方法,主要用于获取数据类型的长度,而在string类型中,length实际只是string的一个属性,C#语法允许像访问一个成员变量那样访问一个属性.为了判断一个字符串长度,可以使用string的length成员,我们将这个特定的成员称为一个只读属性.所以不能设置它,调用它也不需要任何参数.
代码清单 使用string的length成员
static void Main()
{
string palindrome;
System.Console.Write("Enter a palindrome: ");
palindrome = System.Console.ReadLine();
System.Console.WriteLine("The palindrome, \"{0}\" is {1}
characters.",palindrome,palindrome.length);
}
}
字符串是不可变的
string类型的关键特征在于它是不可变的。可以为一个string变量赋一个全新的值,但出于对性能的考虑,没有机制可供修改一个字符串的内容.
代码清单 错误,string是不可变的
{
static void Main()
{
string text;
System.Console.Write("Enter text: ");
text = System.Console.ReadLine();
text.ToUpper();
System.Console.WriteLine(text);
}
}
输出
Enter text:This is a test of the emergency broadcast system.
System.Text.string 和 System.Text.StringBuilder 区别?
如果有大量字符串进行修改,比如要经历多个步骤来构造一个长字符串,那么应当使用System.Text.StringBuilder.string的原理是在栈中新建一个内存地址,把原有的对象复制到新的地址,然后删除原来的对象.这一来二去的操作很麻烦,效率也不高.这个时候可以改用System.Text.StringBuilder,StringBuilder提供了Append()、AppendFormat()、Insert()、Remove()和Replace()这样的方法.但两者的关键区别在于,在System.Text.StringBuilder上,这些方法会修改变量中的数据,而不是返回一个新字符串.
null和void
与类型有关的两个额外的关键字是null和void.null是一个字面值,用来表示数据类型(具体就是引用类型)未被赋予任何值.void用来表示没有类型,或者没有任何值.
null值只能赋给引用类型,不能赋给值类型.引用类型包含一个指针、一个地址、或者一个引用,它指向内存中的一个特定位置.
必须注意的是,和根本不进行赋值相比,将null赋给一个引用类型完全是不同的概念.换言之,赋值为null的变量已被设置,而未进行赋值的变量未被设置.所以假如在赋值前使用变量,通常会造成一个编译时错误.
null意味着变量无任何值,而""意味着变量有一个值,一个空字符串.
void本质上并不是一个数据类型,它只是用于指出没有数据类型这一事实.