一.技术架构
组件对象模型(Component Object Model,COM)源自对象链接和嵌入(Object Linjing and Embedding,OLE)。现在,在Windows上软件组件之间的通信几乎都使用COM实现。因此,.NET能够提供现有COM组件的包装器(wrapper),以便.NET组件与之通信。
1.1公共语言运行库
.NET Framework的核心是其运行库执行环境,称为公共语言运行库(CLR)或.NET运行库。通常将在CLR控制下运行的代码称为托管代码(managed code)。
但是,在CLR执行编写好的源代码(使用C#或其他语言编写的代码)之前,需要编译它们。在.NET中,编译分为两个阶段:
(1)将源代码编译为 Microsoft中间语言(IL)。
(2)CLR把IL编译为平台专用的代码
这个两阶段的编译过程非常重要,因为Microsoft中间语言是提供.NET的许多优点的关键。Microsoft中间语言与Java字节码共享一种理念:它们都是低级语言,语法很简单(使用数字代码,而不是文本代码),可以非常快速地转换为本地机器码。对于代码,这种精心设计的通用语法有很重要的优点:平台无关性、提高性能和语言的互操作性。
1.2COM和 COM+
从技术上讲,COM和COM+并不是面向.NET 的技术,因为基于它们的组件不能编译为(但如果原来的COM组件是用C++编写的,那么使用托管C++在某种程度上可以这么做)。但是, COM+仍然是一个重要工具,因为它包含一些.NET 不具备的特性。另外,COM组件仍可以使用——NET集成了COM的互操作性,从而使托管代码可以调用COM组件,COM组件也可以调用托管代码。一般情况下,把新组件编写为.NET 组件,大多是为了方便,因为这样可以利用.NET 基类和托管代码的其他优点。
1.3面向对象和接口的支持
.NET的语言无关性还有一些实际的限制。中间语言在设计时就打算实现某些特殊的编程方法,这表示面向它的语言必须与该编程方法兼容,Microsoft为IL选择的特定道路是传统的面向对象的编程,带有类的单一继承性。
除了传统的面向对象编程外,中间语言还引入了接口的概念,在带有COM的Windows下第一次实现了接口。用.NET建立的接口与COM接口不同,它们不需要支持任何COM基础设施,例如,它们不是派生自IUnknown,也没有对应的GUID。但它们与COM接口共享下述理念:提供个契约,实现给定接口的类必须提供该接口指定的方法和属性的实现。
COM是一个二进制标准,允许组件实例化其他组件,调用它们的方法或属性,而无须考虑编写相关组件的语言。但为了实现这个功能,每个对象都必须通过COM运行库来实例化,通过接口来访问。根据相关组件的线程模型,需要在不同线程的内存空间和运行组件之间编组数据,这可能造成很大的性能损失。在极端情况下,组件保存为可执行文件,而不是DLL文件,还必须创建单独的进程来运行它们。重要的是组件仅能通过COM运行库与其他组件通信。使用不同语言的组件无法通过COM直接彼此通信,或者创建彼此的实例——系统总将COM作为中间件。不仅如此,COM体系结构还不允许利用继承实现,即它丧失了面向对象编程的许多优势。
一个相关的问题是,在调试时,仍必须单独调试使用不同语言编写的组件。不可能在调试器上交替调试不同语言的代码。语言互操作性的真正含义是用一种语言编写的类应能直接与用另一种语言编写的类通信。特别是:
- 用一种语言编写的类应能继承用另一种语言编写的类。
- 一个类应能包含另一个类的实例,而不管两个类是使用什么语言编写的。一个对象应能直接调用用其他语言编写的另一个对象的方法。
- 对象(或对象的引用)应能在方法之间传递。
- 在不同的语言之间调用方法时,应能在调试器中交替调试这些方法调用,即调试不同语言编写的源代码。
这是一个雄心勃勃的目标,但令人惊讶的是,.NET 和中间语言已经实现了这个目标。在调试器上交替调试方法时,Visual Studio IDE(Intergrated Development Environment,集成开发环境)提供了这样的工具(不是CLR提供的)。
二、通用类型系统(CTS)
此类数据类型问题在.NET中使用通用类型系统(CTS)得到了解决。CTS定义了可以在中间语言中使用的预定义数据类型,所有面向.NET Framework 的语言都可以生成最终基于这些类型的编译代码。
CTS不仅指定了基本数据类型,还定义了一个内容丰富的类型层次结构,其中包含设计合理的位置,在这些位置上,代码允许定义它自己的类型。CTS的层次结构反映了中间语言的单一继承的面向对象方法.
三、运算符
类别 | 运算符 |
算术运算符 | +,-,*,/,% |
逻辑运算符 | &,|,&&,~,^,||,! |
字符串连接运算符 | + |
移位运算符 | <<,>> |
比较运算符 | ==,!=,<>,<=>,= |
赋值运算符 | =,+=,*=,-=,/=,%= |
成员访问运算符(用于于对象和结构) | . |
索引运算符(用于数组和索引器) | [] |
类型转换运算符 | () |
条件运算符 | ?: |
委托连接和删除运算符 | + - |
对象创建运算符 | new |
类型信息运算符 | sizeof is typeof as |
溢出异常控制运算符 | checked unchecked |
间接寻址运算符 | [] |
名称空间别名限定符 | :: |
空合并运算符 | ?? |
三、C#关键字
关键字是 C# 编译器预定义的保留字。这些关键字不能用作标识符,但是,如果您想使用这些关键字作为标识符,可以在关键字前面加上 @ 字符作为前缀。
在 C# 中,有些关键字在代码的上下文中有特殊的意义,如 get 和 set,这些被称为上下文关键字(contextual keywords)。
下表列出了 C# 中的保留关键字(Reserved Keywords)和上下文关键字(Contextual Keywords):
保留关键字
abstract | as | base | bool | break | byte | case |
catch | char | checked | class | const | continue | decimal |
default | delegate | do | double | else | enum | event |
explicit | extern | false | finally | fixed | float | for |
foreach | goto | if | implicit | in | in(genertic modidier) | int |
interface | internal | is | lock | long | namespace | new |
null | object | operator | out | out(generic modifier) | override | params |
private | protected | public | readonly | ref | return | sbyte |
sealed | short | sizeof | stackalloc | static | string | struct |
switch | this | throw | true | try | typeof | uint |
ulong | unchecked | unsafe | ushort | using | virtual | void |
volatile | while |
上下文关键字:
add | alias | ascending | descending | dynamic | from | get |
global | group | into | join | let | orderby | partial(type) |
partial(method) | remove | select | set |