博文
C# 语言规范--2.4.2 标识符(2006-09-03 18:36:00)
摘要:本节给出的标识符规则完全符合 Unicode 标准附件 15 推荐的规则,但以下情况除外:允许将下划线用作初始字符(这是 C 编程语言的传统),允许在标识符中使用 Unicode 转义序列,以及允许“@”字符作为前缀以使关键字能够用作标识符。
identifier:(标识符:)
available-identifier(可用的标识符)
@ identifier-or-keyword(@ 标识符或关键字)
available-identifier:(可用的标识符:)
不是“关键字”的“标识符或关键字”
identifier-or-keyword:(标识符或关键字:)
identifier-start-character identifier-part-charactersopt(标识符开始字符 标识符部分字符可选)
identifier-start-character:(标识符开始字符:)
letter-character(字母字符)
_(下划线字符 U+005F)
identifier-part-characters:(标识符部分字符:)
identifier-part-character(标识符部分字符)
identifier-part-characters identifier-part-character(标识符部分字符 标识符部分字符)
identifier-part-character:(标识符部分字符:)
letter-character(字母字符)
decimal-digit-character(十进制数字字符)
connecting-character(连接字符)
combining-character(组合字符)
formatting-character(格式设置字符)
letter-character:(字母字符:)
类 Lu、Ll、Lt、Lm、Lo 或 Nl 的 Unicode 字符
表示类 Lu、Ll、Lt、Lm、Lo 或 Nl 的字符......
C# 语言规范--2.4.1 Unicode 字符转义序列(2006-09-03 18:35:00)
摘要:Unicode 字符转义序列表示一个 Unicode 字符。Unicode 字符转义序列在标识符(第 2.4.2 节)、字符(第 2.4.4.4 节)和规则字符串(第 2.4.4.5 节)中处理。不在其他任何位置处理 Unicode 字符转义(例如,在构成运算符、标点符号或关键字时)。
unicode-escape-sequence:(unicode 转义序列:)
\u hex-digit hex-digit hex-digit hex-digit(\u 十六进制数字 十六进制数字 十六进制数字 十六进制数字)
\U hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit hex-digit(\U 十六进制数字 十六进制数字 十六进制数字 十六进制数字 十六进制数字 十六进制数字 十六进制数字 十六进制数字)
Unicode 转义序列表示由“\u”或“\U”字符后面的十六进制数字构成的单个 Unicode 字符。由于 C# 在字符和字符串值中使用 Unicode 代码点的 16 位编码,因此从 U+10000 到 U+10FFFF 的 Unicode 字符不能在字符中使用,在字符串中则用一个 Unicode 代理项对来表示。不支持代码数据点在 0x10FFFF ......
C# 语言规范--2.4 标记(2006-09-03 18:35:00)
摘要:有若干种标记:标识符、关键字、文本、运算符和标点符号。空白和注释不是标记,但它们可充当标记的分隔符。
token:(标记:)
identifier(标识符)
keyword(关键字)
integer-literal(整数)
real-literal(实数)
character-literal(字符)
string-literal(字符串)
operator-or-punctuator(运算符或标点) ......
C# 语言规范--2.3.3 注释(2006-09-03 18:35:00)
摘要:支持两种形式的注释:单行注释和带分隔符的注释。单行注释以字符 // 开头并延续到源行的结尾。带分隔符的注释以字符 /* 开头,以字符 */ 结束。带分隔符的注释可以跨多行。
comment:(注释:)
single-line-comment(单行注释)
delimited-comment(带分隔符的注释)
single-line-comment:(单行注释:)
// input-charactersopt(// 输入字符可选)
input-characters:(输入字符:)
input-character(输入字符)
input-characters input-character(输入字符 输入字符)
input-character:(输入字符:)
除换行符外的任何 Unicode 字符
new-line-character:(换行符:)
回车符 (U+000D)
换行符 (U+000A)
行分隔符 (U+2028)
段落分隔符 (U+2029)
delimited-comment:(带分隔符的注释:)
/* delimited-comment-charactersopt */(/* 带分隔符的注释字符可选 */)
delimited-comment-characters:(带分隔符的注释字符:)
delimited-comment-character(带分隔符的注释字符)
delimited-comment-characters delimited-comment-character(带分隔符的注释字符 带分隔符的注释字符)
delimited-comment-character:(带分隔符的注释字符:)
not-asterisk(非星号)
* not-slash(* &nb......
C# 语言规范--2.3.2 空白(2006-09-03 18:34:00)
摘要:空白被定义为任何含 Unicode 类 Zs 的字符(包括空白字符)以及水平制表符、垂直制表符和换页符。
whitespace:(空白:)
任何含 Unicode 类 Zs 的字符
水平制表符 (U+0009)
垂直制表符 (U+000B)
换页符 (U+000C)
......
C# 语言规范--2.3.1 行结束符(2006-09-03 18:34:00)
摘要:行结束符将 C# 源文件的字符划分为行。
new-line:(新行:)
回车符 (U+000D)
换行符 (U+000A)
回车符 (U+000D) 后跟换行符 (U+000A)
行分隔符 (U+2028)
段落分隔符 (U+2029)
为了与添加文件尾标记的源代码编辑工具兼容,并能够以正确结束的行序列的形式查看源文件,下列转换按顺序应用到 C# 程序中的每个源文件:
如果源文件的最后一个字符为 Control-Z 字符 (U+001A),则删除此字符。
如果源文件非空并且源文件的最后一个字符不是回车符 (U+000D)、换行符 (U+000A)、行分隔符 (U+2028) 或段落分隔符 (U+2029),则将在源文件的结尾添加一个回车符 (U+000D)。
......
C# 语言规范--2.2.1 文法表示法(2006-09-03 18:34:00)
摘要:词法文法和句法文法用文法产生式来表示。每个文法产生式定义一个非结束符号和它可能的扩展(由非结束符或结束符组成的序列)。在文法产生式中,非结束符号显示为斜体,而结束符号显示为等宽字体。
文法产生式的第一行是该产生式所定义的非结束符号的名称,后跟一个冒号。每个后续的缩进行列出一个可能的扩展,它是以非结束符或结束符组成的序列的形式给出的。例如,产生式:
while-statement:(while 语句:)
while ( boolean-expression ) embedded-statement(while ( 布尔表达式 ) 嵌入语句)
定义了一个 while 语句,它是这样构成的:由标记 while 开始,后跟标记“(”、布尔表达式、标记“)”和嵌入的语句。
当有不止一个可能的非结束符号扩展时,列出这些可能的扩展(每个扩展单独占一行)。例如,产生式:
statement-list:(语句列表:)
statement(语句)
statement-list statement(语句列表 语句)
定义一个语句列表,它或仅含有一个语句,或由一个语句列表和随后跟着的一个语句组成。换言之,定义是递归的,语句列表由一个或多个语句组成。
一个符号若以下标“可选”作其后缀,就表明该符号是可选的。产生式:
block:(块:)
{ statement-listopt }({ 语句列表可选 })
是以下产生式的简短形式:
block:(块:)
{ }
{ statement-list }({ 语句列表&nb......
C# 语言规范--2.1 程序(2006-09-03 18:33:00)
摘要:C# 程序由一个或多个源文件(正规地应称为编译单元(第 9.1 节))组成。源文件是有序的 Unicode 字符序列。源文件与文件系统中的文件通常具有一对一的对应关系,但这种对应关系不是必需的。为实现最大的可移植性,建议这些文件在文件系统中应按 UTF-8 规范编码。
从概念上讲,程序的编译分三个步骤:
转换,这一步将用特定字符指令系统和编码方案编写的文件转换为 Unicode 字符序列。
词法分析,这一步将 Unicode 输入字符流转换为标记流。
句法分析,这一步将标记流转换为可执行代码。
......
C# 语言规范--1.14 属性(2006-09-03 18:33:00)
摘要:C# 是一种命令式语言,但像所有命令式语言一样,它具有某些声明性元素。例如,通过将类中的方法声明为 public、protected、internal、protected internal 或 private,指定它的可访问性。C# 使此功能一般化,以便程序员可以创造出一种新的声明性信息,将此声明性信息附加到各种程序实体,并在运行时检索此声明性信息。程序通过定义和使用属性(第 17 节)来描述这类额外的声明性信息。
例如,一个框架也许会定义一个可放置在程序元素(如类和方法)上的 HelpAttribute 属性,使开发人员能够提供从程序元素到其文档的映射。示例using System;
[AttributeUsage(AttributeTargets.All)]
public class HelpAttribute: Attribute
{
public HelpAttribute(string url) {
this.url = url;
}
public string Topic = null;
private string url;
public string Url {
get { return url; }
}
}
定义了一个名为 HelpAttribute 的属性类,它具有一个定位参数 (string url) 和一个命名参数 (string Topic)。正如第 17.1 节中所解释的,该属性可以通过它的完整名称 HelpAttribute 或通过它的隐式简称 Help 引用。定位参数由该属性类的公共实例构造函数的形参定义,命名参数则由属性类的公共非静态读写字段和对应的属性定义。
示例[Help("http://www.microsoft.com/.../Class1.htm")]
public class Class1
{
[Help("http://www.microsoft.com/.../Class1.htm", Topic = "F")]
public void F() {}
}
显示 Help 属性的几种用法。
在运行时可以利用反射支持检索给定程序元素的属性信息。示例using System;
class Test
{......
C# 语言规范--1.13 版本控制(2006-09-03 18:32:00)
摘要:版本控制是一个过程,它以兼容的方式对组件进行不断的改进。如果依赖于早期版本的代码重新编译后可以适用于新版本,则组件的新版本与早期版本源代码兼容。相反,如果依赖于早期版本的应用程序不用重新编译即可适用于新版本,则组件的新版本为二进制兼容。
大多数语言根本不支持二进制兼容性,而且许多语言对促进源代码兼容性所做甚少。实际上,某些语言所含的缺陷使得用它开发出来的组件在不断的改进过程中,一般至少会使依赖于该组件的某些客户端代码失效。
例如,请看一个发布名为 Base 的类的基类作者的情况。在第一个版本中,Base 不包含任何 F 方法。名为 Derived 的组件从 Base 派生,并引入 F。此 Derived 类与它所依赖的 Base 类一起发布给客户,客户又部署到众多客户端和服务器。// Author A
namespace A
{
public class Base // version 1
{
}
}
// Author B
namespace B
{
class Derived: A.Base
{
public virtual void F() {
System.Console.WriteLine("Derived.F");
}
}
}
从这时起,开始产生版本问题。Base 的作者生成了一个拥有自己的 F 方法的新版本。// Author A
namespace A
{
public class Base // version 2
{
public virtual void F() { // added in version 2
System.Console.WriteLine("Base.F");
}
}
}
这个新版本的 Base 在源代码和二进制方面都应该与初始版本兼容。(如果仅添加一个新的方法就会产兼容性问题,则基类可能就永远不能改进了。)不幸的是,Base 中的新 F 使 Derived 的 F 的含义不清。Derived 是指重写 Base 的 F 吗?这看上去不太可能,因为编译 Derived 时,Base 还没有 F!......