C#语言规范5.0中文版
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
using Acme.Collections;
class Test
{
static void Main() {
Stack s = new Stack();
s.Push(1);
s.Push(10);
s.Push(100);
Console.WriteLine(s.Pop());
Console.WriteLine(s.Pop());
“Hello, World”程序中声明的Hello类只有一个成员,即名为Main的方法。Main方法是使用static修饰符声明的。实例方法可以使用关键字this来引用特定的封闭对象实例,而静态方法的操作不需要引用特定对象。按照惯例,名为Main的静态方法将作为程序的入口点。
该程序的输出由System命名空间中的Console类的WriteLine方法产生。此类由.NET Framework类库提供,默认情况下,Microsoft C#编译器自动引用该类库。注意,C#语言本身没有单独的运行库。事实上,.NET Framework就是C#运行库。
0...4,294,967,295
64
ulong
0...18,446,744,073,709,551,615
浮点型
32
float
1.5×10−45至3.4×1038,7位精度
64
double
1.5×10−324至1.7×10308,15位精度
1.3
C#中的类型有两种:值类型(value type)和引用类型(reference type)。值类型的变量直接包含它们的数据,而引用类型的变量存储对它们的数据的引用,后者称为对象。对于引用类型,两个变量可能引用同一个对象,因此对一个变量的操作可能影响另一个变量所引用的对象。对于值类型,每个变量都有它们自己的数据副本(除ref和out参数变量外),因此对一个变量的操作不可能影响另一个变量。
C#具有一个同一类型系统(unified type system)。所有C#类型(包括诸如int和double之类的基元类型)都继承于单个根类型:object。因此,所有类型都共享一组通用操作,并且任何类型的值都能够以一致的方式进行存储、传递和操作。此外,C#同时支持用户定义的引用类型和值类型,既允许对象的动态分配,也允许轻量结构的内联存储。
C#的值类型进一步划分为简单类型(simple type)、枚举类型(enum type)、结构类型(struct type)和可以为null的类型(nullable type),C#的引用类型进一步划分为类类型(class type)、接口类型(interface type)、数组类型(array type)和委托类型(delegate type)。
1.
C#(读作“See Sharp”)是一种简洁、现代、面向对象且类型安全的编程语言。C#起源于C语言家族,因此,对于C、C++和Java程序员,可以很快熟悉这种新的语言。C#已经分别由ECMA International和ISO/IEC组织接受并确立了标准,它们分别是ECMA-334标准和ISO/IEC 23270标准。Microsoft用于.NET Framework的C#编译器就是根据这两个标准实现的。
有助于构造健壮、持久的应用程序的若干C#特性:垃圾回收(Garbage collection)将自动回收不再使用的对象所占用的内存;异常处理(exception handling)提供了结构化和可扩展的错误检测和恢复方法;类型安全(type-safe)的语言设计则避免了读取未初始化的变量、数组索引超出边界或执行未经检查的类型强制转换等情形。
数组类型
一维和多维数组,例如int[]和int[,]
委托类型
delegate int D(...)形式的用户定义的类型
八种整型类型分别支持8位、16位、32位和64位整数值的有符号和无符号的形式。
两种浮点类型:float和double,分别使用32位单精度和64位双精度的IEEE 754格式表示。
decimal类型是128位的数据类型,适合用于财务计算和货币计算。
if (top == null) throw new InvalidOperationException();
object result = top.data;
top = top.next;
return result;
}
class Entry
{
public Entry next;
public object data;
本章的其余部分将描述C#语言的基本特征。尽管后面的章节会更为详尽,有时甚至逻辑缜密地对规则和例外情况进行描述,但本章的描述力求简洁明了,因而难免会牺牲完整性。这样做是为了向读者提供关于该语言的概貌,一方面使读者能尽快上手编写程序,另一方面为阅读后续章节提供指导。
1.1
按照约定俗成的惯例,我们先从“Hello, World”程序着手介绍这一编程语言。下面是它的C#程序:
using System;
class Hello
{
static v4;Hello, World");
}
}
C#源文件的扩展名通常是.cs。假定“Hello, World”程序存储在文件hello.cs中,可以使用下面的命令行调用Microsoft C#编译器编译这个程序:
public Entry(Entry next, object data) {
this.next = next;
this.data = data;
}
}
}
}
在名为Acme.Collections的命名空间中声明了一个名为Stack的类。Acme.Collections.Stack是此类的完全限定名。该类包含几个成员:一个名为top的字段,两个分别名为Push和Pop的方法和一个名为Entry的嵌套类。Entry类还包含三个成员:一个名为next的字段、一个名为data的字段和一个构造函数。假定将此示例的源代码存储在文件acme.cs中,执行以下命令行:
C#
语言规范
版本5.0
注意
© 1999-2012 Microsoft Corporation。保留所有权利。
Microsoft、Windows、Visual Basic、Visual C#和Visual C++是Microsoft Corporation在美国和/或其他国家/地区的注册商标或商标。
本文提及的其他产品和公司名称可能是其各自所有者的商标。
C#是面向对象的语言,然而C#进一步提供了对面向组件(component-oriented)编程的支持。现代软件设计日益依赖于自包含和自描述功能包形式的软件组件。这种组件的关键在于,它们通过属性、方法和事件来提供编程模型;它们具有提供了关于组件的声明性信息的特性;同时,它们还编入了自己的文档。C#提供的语言构造直接支持这些概念,这使得C#语言自然而然成为创建和使用软件组件之选。
–32,768...32,767
32
int
–2,147,483,648...2,147,483,647
64
long
–9,223,372,036,854,775,808...9,223,372,036,854,775,807
无符号整型
8
byte
0...255
16
ushort
0...65,535
32
uint
结构类型
struct S {...}形式的用户定义的类型
可以为null的类型
其他所有具有null值的值类型的扩展
引用
类型
类类型
所有其他类型的最终基类:object
Unicode字符串:string
classC{...}形式的用户定义的类型
接口类型
interface I {...}形式的用户定义的类型
C#的bool类型用于表示值为true或false的布尔值。
在C#中,字符和字符串处理使用Unicode编码。char类型表示一个UTF-16编码单元,string类型表示UTF-16编码单元的序列。
下表总结了C#的数值类型。
类别
位数
类型
范围/精度
有符号整型
8
sbyte
–128...127
16
short
下面的示例
using System;
namespace Acme.Collections
{
public class Stack
{
Entry top;
public void Push(object data) {
top = new Entry(top, data);
}
public object Pop() {
1.2
C#中的组织结构的关键概念是程序(program)、命名空间(namespace)、类型(type)、成员(member)和程序集(assembly)。C#程序由一个或多个源文件组成。程序中声明类型,类型包含成员,并且可按命名空间进行组织。类和接口就是类型的示例。字段(field)、方法、属性和事件是成员的示例。在编译C#程序时,它们被物理地打包为程序集。程序集通常具有文件扩展名.exe或.dll,具体取决于它们是实现应用程序(application)还是实现库(library)。
下表为C#类型系统的概述。
类别
说明
值
类型
简单类型
有符号整型:sbyte、short、int、long
无符号整型:byte、ushort、uint、ulong
Unicode字符:char
IEEE浮点:float、double
高精度小数型:decimal
布尔:bool
枚举类型
enum E {...}形式的用户定义的类型
由于程序集是一个自描述的功能单元,它既包含代码又包含元数据,因此,C#中不需要#include指令和头文件。若要在C#程序中使用某特定程序集中包含的公共类型和成员,只需在编译程序时引用该程序集即可。例如,下面的程序将使用来自acme.dll程序集的Acme.Collections.Stack类:
using System;
csc /t:library acme.cs
将此示例编译为一个库(没有Main入口点的代码),并产生一个名为acme.dll的程序集。
程序集包含中间语言(Intermediate Language, IL)指令形式的可执行代码和元数据(metadata)形式的符号信息。在执行程序集之前,.NET公共语言运行时的实时(JIT)编译器将程序集中的IL代码自动转换为特定于处理器的代码。
csc hello.cs
编译后将生成一个名为hello.exe的可执行程序集。当此应用程序运行时,输出结果如下:
Hello, World
“Hello, World”程序的开头是一个using指令,它引用了System命名空间。命名空间提供了一种分层的方式来组织C#程序和库。命名空间中包含有类型及其他命名空间—例如,System命名空间包含若干类型(如此程序中引用的Console类)以及若干其他命名空间(如IO和Collections)。如果使用using指令引用了某一给定命名空间,就可以通过非限定方式使用作为该命名空间成员的类型。正是由于使用了using指令,该程序才可以采用Console.WriteLine这一简化形式代替System.Console.WriteLine。
Console.WriteLine(s.Pop());
}
}
如果此程序存储在文件test.cs中,那么在编译test.cs时,可以使用编译器的/r选项引用acme.dll程序集:
csc /r:acme.dll test.cs
这样将创建名为test.exe的可执行程序集,运行结果如下:
100
10
1
C#允许将一个程序的源文本存储在多个源文件中。在编译多个文件组成的C#程序时,所有源文件将一起处理,并且源文件可以自由地相互引用—从概念上讲,就像是在处理之前将所有源文件合并为一个大文件。C#中从不需要前向声明,因为除了极少数的例外情况,声明顺序无关紧要。C#不限制一个源文件只能声明一个公共类型,也不要求源文件的名称与该源文件中声明的类型匹配。
为了确保C#程序和库能够以兼容的方式逐步演进,C#的设计中充分强调了版本控制(versioning)。许多编程语言不太重视这一点,导致采用那些语言编写的程序常常因为其所依赖的库的更新而无法正常工作。C#的设计在某些方面直接考虑到版本控制的需要,其中包括单独使用的virtual和override修饰符、方法重载决策规则以及对显式接口成员声明的支持。
class Test
{
static void Main() {
Stack s = new Stack();
s.Push(1);
s.Push(10);
s.Push(100);
Console.WriteLine(s.Pop());
Console.WriteLine(s.Pop());
“Hello, World”程序中声明的Hello类只有一个成员,即名为Main的方法。Main方法是使用static修饰符声明的。实例方法可以使用关键字this来引用特定的封闭对象实例,而静态方法的操作不需要引用特定对象。按照惯例,名为Main的静态方法将作为程序的入口点。
该程序的输出由System命名空间中的Console类的WriteLine方法产生。此类由.NET Framework类库提供,默认情况下,Microsoft C#编译器自动引用该类库。注意,C#语言本身没有单独的运行库。事实上,.NET Framework就是C#运行库。
0...4,294,967,295
64
ulong
0...18,446,744,073,709,551,615
浮点型
32
float
1.5×10−45至3.4×1038,7位精度
64
double
1.5×10−324至1.7×10308,15位精度
1.3
C#中的类型有两种:值类型(value type)和引用类型(reference type)。值类型的变量直接包含它们的数据,而引用类型的变量存储对它们的数据的引用,后者称为对象。对于引用类型,两个变量可能引用同一个对象,因此对一个变量的操作可能影响另一个变量所引用的对象。对于值类型,每个变量都有它们自己的数据副本(除ref和out参数变量外),因此对一个变量的操作不可能影响另一个变量。
C#具有一个同一类型系统(unified type system)。所有C#类型(包括诸如int和double之类的基元类型)都继承于单个根类型:object。因此,所有类型都共享一组通用操作,并且任何类型的值都能够以一致的方式进行存储、传递和操作。此外,C#同时支持用户定义的引用类型和值类型,既允许对象的动态分配,也允许轻量结构的内联存储。
C#的值类型进一步划分为简单类型(simple type)、枚举类型(enum type)、结构类型(struct type)和可以为null的类型(nullable type),C#的引用类型进一步划分为类类型(class type)、接口类型(interface type)、数组类型(array type)和委托类型(delegate type)。
1.
C#(读作“See Sharp”)是一种简洁、现代、面向对象且类型安全的编程语言。C#起源于C语言家族,因此,对于C、C++和Java程序员,可以很快熟悉这种新的语言。C#已经分别由ECMA International和ISO/IEC组织接受并确立了标准,它们分别是ECMA-334标准和ISO/IEC 23270标准。Microsoft用于.NET Framework的C#编译器就是根据这两个标准实现的。
有助于构造健壮、持久的应用程序的若干C#特性:垃圾回收(Garbage collection)将自动回收不再使用的对象所占用的内存;异常处理(exception handling)提供了结构化和可扩展的错误检测和恢复方法;类型安全(type-safe)的语言设计则避免了读取未初始化的变量、数组索引超出边界或执行未经检查的类型强制转换等情形。
数组类型
一维和多维数组,例如int[]和int[,]
委托类型
delegate int D(...)形式的用户定义的类型
八种整型类型分别支持8位、16位、32位和64位整数值的有符号和无符号的形式。
两种浮点类型:float和double,分别使用32位单精度和64位双精度的IEEE 754格式表示。
decimal类型是128位的数据类型,适合用于财务计算和货币计算。
if (top == null) throw new InvalidOperationException();
object result = top.data;
top = top.next;
return result;
}
class Entry
{
public Entry next;
public object data;
本章的其余部分将描述C#语言的基本特征。尽管后面的章节会更为详尽,有时甚至逻辑缜密地对规则和例外情况进行描述,但本章的描述力求简洁明了,因而难免会牺牲完整性。这样做是为了向读者提供关于该语言的概貌,一方面使读者能尽快上手编写程序,另一方面为阅读后续章节提供指导。
1.1
按照约定俗成的惯例,我们先从“Hello, World”程序着手介绍这一编程语言。下面是它的C#程序:
using System;
class Hello
{
static v4;Hello, World");
}
}
C#源文件的扩展名通常是.cs。假定“Hello, World”程序存储在文件hello.cs中,可以使用下面的命令行调用Microsoft C#编译器编译这个程序:
public Entry(Entry next, object data) {
this.next = next;
this.data = data;
}
}
}
}
在名为Acme.Collections的命名空间中声明了一个名为Stack的类。Acme.Collections.Stack是此类的完全限定名。该类包含几个成员:一个名为top的字段,两个分别名为Push和Pop的方法和一个名为Entry的嵌套类。Entry类还包含三个成员:一个名为next的字段、一个名为data的字段和一个构造函数。假定将此示例的源代码存储在文件acme.cs中,执行以下命令行:
C#
语言规范
版本5.0
注意
© 1999-2012 Microsoft Corporation。保留所有权利。
Microsoft、Windows、Visual Basic、Visual C#和Visual C++是Microsoft Corporation在美国和/或其他国家/地区的注册商标或商标。
本文提及的其他产品和公司名称可能是其各自所有者的商标。
C#是面向对象的语言,然而C#进一步提供了对面向组件(component-oriented)编程的支持。现代软件设计日益依赖于自包含和自描述功能包形式的软件组件。这种组件的关键在于,它们通过属性、方法和事件来提供编程模型;它们具有提供了关于组件的声明性信息的特性;同时,它们还编入了自己的文档。C#提供的语言构造直接支持这些概念,这使得C#语言自然而然成为创建和使用软件组件之选。
–32,768...32,767
32
int
–2,147,483,648...2,147,483,647
64
long
–9,223,372,036,854,775,808...9,223,372,036,854,775,807
无符号整型
8
byte
0...255
16
ushort
0...65,535
32
uint
结构类型
struct S {...}形式的用户定义的类型
可以为null的类型
其他所有具有null值的值类型的扩展
引用
类型
类类型
所有其他类型的最终基类:object
Unicode字符串:string
classC{...}形式的用户定义的类型
接口类型
interface I {...}形式的用户定义的类型
C#的bool类型用于表示值为true或false的布尔值。
在C#中,字符和字符串处理使用Unicode编码。char类型表示一个UTF-16编码单元,string类型表示UTF-16编码单元的序列。
下表总结了C#的数值类型。
类别
位数
类型
范围/精度
有符号整型
8
sbyte
–128...127
16
short
下面的示例
using System;
namespace Acme.Collections
{
public class Stack
{
Entry top;
public void Push(object data) {
top = new Entry(top, data);
}
public object Pop() {
1.2
C#中的组织结构的关键概念是程序(program)、命名空间(namespace)、类型(type)、成员(member)和程序集(assembly)。C#程序由一个或多个源文件组成。程序中声明类型,类型包含成员,并且可按命名空间进行组织。类和接口就是类型的示例。字段(field)、方法、属性和事件是成员的示例。在编译C#程序时,它们被物理地打包为程序集。程序集通常具有文件扩展名.exe或.dll,具体取决于它们是实现应用程序(application)还是实现库(library)。
下表为C#类型系统的概述。
类别
说明
值
类型
简单类型
有符号整型:sbyte、short、int、long
无符号整型:byte、ushort、uint、ulong
Unicode字符:char
IEEE浮点:float、double
高精度小数型:decimal
布尔:bool
枚举类型
enum E {...}形式的用户定义的类型
由于程序集是一个自描述的功能单元,它既包含代码又包含元数据,因此,C#中不需要#include指令和头文件。若要在C#程序中使用某特定程序集中包含的公共类型和成员,只需在编译程序时引用该程序集即可。例如,下面的程序将使用来自acme.dll程序集的Acme.Collections.Stack类:
using System;
csc /t:library acme.cs
将此示例编译为一个库(没有Main入口点的代码),并产生一个名为acme.dll的程序集。
程序集包含中间语言(Intermediate Language, IL)指令形式的可执行代码和元数据(metadata)形式的符号信息。在执行程序集之前,.NET公共语言运行时的实时(JIT)编译器将程序集中的IL代码自动转换为特定于处理器的代码。
csc hello.cs
编译后将生成一个名为hello.exe的可执行程序集。当此应用程序运行时,输出结果如下:
Hello, World
“Hello, World”程序的开头是一个using指令,它引用了System命名空间。命名空间提供了一种分层的方式来组织C#程序和库。命名空间中包含有类型及其他命名空间—例如,System命名空间包含若干类型(如此程序中引用的Console类)以及若干其他命名空间(如IO和Collections)。如果使用using指令引用了某一给定命名空间,就可以通过非限定方式使用作为该命名空间成员的类型。正是由于使用了using指令,该程序才可以采用Console.WriteLine这一简化形式代替System.Console.WriteLine。
Console.WriteLine(s.Pop());
}
}
如果此程序存储在文件test.cs中,那么在编译test.cs时,可以使用编译器的/r选项引用acme.dll程序集:
csc /r:acme.dll test.cs
这样将创建名为test.exe的可执行程序集,运行结果如下:
100
10
1
C#允许将一个程序的源文本存储在多个源文件中。在编译多个文件组成的C#程序时,所有源文件将一起处理,并且源文件可以自由地相互引用—从概念上讲,就像是在处理之前将所有源文件合并为一个大文件。C#中从不需要前向声明,因为除了极少数的例外情况,声明顺序无关紧要。C#不限制一个源文件只能声明一个公共类型,也不要求源文件的名称与该源文件中声明的类型匹配。
为了确保C#程序和库能够以兼容的方式逐步演进,C#的设计中充分强调了版本控制(versioning)。许多编程语言不太重视这一点,导致采用那些语言编写的程序常常因为其所依赖的库的更新而无法正常工作。C#的设计在某些方面直接考虑到版本控制的需要,其中包括单独使用的virtual和override修饰符、方法重载决策规则以及对显式接口成员声明的支持。