C#是相对较新的语言,它是建立在C风格语言基础上(C,C++和JAVA),对于许多有经验的程序员可以立刻熟悉它。有十分复杂的执行平台叫做通用语言架构(CLI),C#是用来构建软件组件和应用的编程语言。
本章介绍使用C#产生典型的HelloWorld程序。这一章的中心是C#基本语法,包括在C#可执行程序中定义入口点。这将让你熟悉C#语法和结构,并且让你执行这个最简单的C#程序。首先会讨论C#在执行方面基本语法,这将讲解C#程序时如何运行的。本章结束时会讨论变量声明,向控制台输入输出数据,还有在C#中如何注释。
Hello, World
学习新的编程语言的最好办法就是写代码。第一个例子就是典型的HelloWorld程序。在这个程序中,你将在屏幕上显示一些文本。
清单1.1是完整的Helloworld程序,在随后的小节,你就可以编译此段代码。
清单1.1 HelloWorld
class HelloWorld
{
static void Main()
{
System.Console.WriteLine("Hello,My Name is Inigo Montoya");
}
}
注意: C#是大小写敏感语言。只有代码的大小写正确了才能编译成功。 |
对于熟练的Java,C或C++程序员可以立刻看出相似处。就像JAVA,C#的基本语法是源自C和C++。语法标点(比如分号和花括号),特征(比如大小写敏感),还有关键字(比如,class,public,void)这些都是很相似的。新手和其他语言的程序员都能很快的发现这些明显的构成!
编译并运行程序
C#编译器不限制文件扩展名,只要它包含C#源码,不过.CS是默认扩展名。当将源代码保存到文件后,开发者必须编译它(附录A提供了安装编译器的指南)。由于C#并没有标准化命令行指令,所以编译指令时依赖不同C#编译器实现的。
你可以将清单1.1写入一个文件并命名为HelloWorld.cs。然后就像输出1.1那样,在控制台使用微软.Net编译器编译(假设你已经为编译器指定了合适的路径)!
输出1.1
>csc.exe HelloWorld.cs |
不同的编译器版本会有不同的输出。
编译程序后生成HelloWorld.exe。如输出1.2显示
输出1.2
>HelloWorld.exe |
由C#编译器产生的HelloWorld.exe程序,也叫做程序集(assembly)。而不是建立一个可独立运行的完整程序。开发者可以创建一个可被别人引用的代码库,大的程序库(或类库)使用.dll作为扩展名。这是标准的动态链接库(DLL)。一个库文件也是一个程序集。换句话说,C#是从程序集中输出结果,而不管那是程序还是库!
语言对比:Java——文件名必须匹配类名 在Java中,文件名必须和类名一样。而在C#中,这只是沿用此惯例但不强制使用,C#开始可以有两个类在同一个文件中。出现。C#2.0可以让一个类跨越多个文件。 |
C#基本语法
一旦你成功编译并运行了HelloWorld程序,你就要准备剖析代码,来学习它的每一部分。首先,看看C#程序员可以选择使用的标示符关键字(First, consider the C# keywords along with the identifiers that the developer chooses)。
关键字
为了编译器能解释代码,C#肯定需要指定一些单词来表达特殊的状态和意思。这就叫关键字或保留字。并且为编译器提供了语法来解释程序员书写的表达式。在HelloWorld程序中,class,static,void都是关键字。
编译器通过关键字来识别代码的结构。由于编译器严格按照这些词解释,因此你只能在特定规则的编程语言下使用这些关键字。换句话说,编写程序需要开发者在某些特定的位置书写。当程序员违反了这些规则,编译器就会丢出错误信息。
C#关键字
下表是C#中使用的关键字
表1.1
abstract add* as ascending* |
base bool break by* |
byte case catch char |
checked class const continue |
decimal default delegate do |
double descending* else enum |
event explicit extern false |
finally fixed from* float |
for foreach get* group* |
goto if implicit in |
int into* interface internal |
is lock long join* |
let* namespace new null |
object operator orderby* out |
override params partial* private |
protected public readonly re |
remove* return sbyte sealed |
select* set* short sizeof |
stackalloc static string struct |
switch this throw true |
try typeof uint ulong |
unchecked unsafe ushort using |
value* virtual void volatile |
where* while yield* |
*表示和上下文相关的
C#1.0后就没有引入新的关键字。不过,随后的一些版本构建了上下文关键字,它只在特定对的位置才有意义,而在指定的位置之外,上下文关键字没有任何意思。所以C#1.0的代码都可以被之后的版本编译(表1.1中的*就表示上下文关键字)。
标示符
在C#中除了定义关键字,开发者可以使用自己名字。编程语言所引用的这这些名字叫标示符用来识别程序员构建的代码。在清单1.1的HelloWorld中,Main就是一个标示符。By assigning an identifier, it is possible to refer back to the same construct using the identifier。这一点很重要,所以,程序员分配名字要有一定目的,而不是随意使用。作为一个合格的程序员要具有选择一个简洁直观的字符作为标示符,因为这会让最终代码容易理解并重用。因为一些极少出现的原因,某些标示符,比如C#中的Main,具有特别的意思。
类型定义
C#中的所有代码都包含在一个类型定义中,这是最常用的类型定义,它是关键字class。class定义是通常由class<标示符>{…}开始的一段代码。看看清单1.2的展示
清单1.2 基本类定义
——————————————
class HelloWorld
{
…
}
——————————————
类型名可以使随意定义(在这里是,HelloWorld),但是习惯上,它应该首字母大写。如果名字中包含多个单词,每个单词的首字母也应该大写。对于这个例子,也可以是这些名字,Greetings,HelloInigoMontoya,或是简单的Hello。编写CLI的人称这种方式是Pascal式样。因为在Pascal语言中通常这样使用。还有另一种选择,驼峰式样,除了第一个单词的首字母小写以为和上面的式样是一样的。比如quotient,firstName,theDreadPirateRoberts。
通常,一个程序会包含多个类型,每个类型包含多个方法。
Main
什么是方法
在语法上,C#中的方法是一个被方法声明命名的代码块(比如,static void Main())并且在花括号中有0个或更多描述段。方法执行计算或动作。就像写一段话,方法将代码组织到一起,以便更容易阅读。更为重要的是,方法避免了代码复制。方法声明是描述方法,并定义数据在此方法上传输的方法名。清单1.3中, Main(){…} 就是一个方法。
C#程序开始执行与static void Main().当你在控制台上键入Helloworld.exe,程序开始执行,定位到Main后,开始执行第一个段落。
清单1.3 分解Helloworld
————————————————————
————————————————————
尽管Main的方法声明在一定程度上可以有些不同。static,方法名称,Main这几个东西都是必须的
Main方法的声明
也许需要定义无参数或有返回值得Main方法.C#支持这两种定义,就像清单1.4声明了完整的Main方法.
清单1.4 带参数和返回值得Main方法
——————————————————————
static int Main(string[] args)
{
…
}
——————————————————————
参数args是一个对应命名行的字符串数组,不过,这不像C或C++中,头一个参数不是程序名称,而是命令行的第一个命令。为了用命令行控制程序需要引用System.Environment.CommandLine。
整型的返回值是标志码,用来指示程序是否执行成功。非零的值,表示产生的错误。
语言对比:C++/Java——是全小写 不像别的C风格的老前辈,C#在Main方法上使用了大写的M,以便符合Pascal风格的C#惯例。 |
Main方法的Static是指示直接调用此方法,而不用定义类。如果没有static,当控制台运行这个程序时,需要做一些附加的工作(称为初始化,第五章详细讲解了static方法)
Main方法前面的void指示此方法不需要返回任何数据(这将在第二章解释)
C#和C/C++相同都使用花括号构成方法体或类体。比如,main方法在花括号中包含了实现。在这里,方法中只有一个语句。
语句和语句分隔符
Main方法包含了一个简单的语句,System.Console.WriteLine(),这是用来想控制台输出一行文字。C#通常使用分号来标示一个语句的结束。一个语句是由一个或多个动作组成。声明一个变量,控制程序流向,调用方法的子语句。
语言对比:VisualBasic——基于行的语句 有些语言是基于行的,意思是在没有特别的解释时,语句是不能跨行的。VB就是基于行的语言。它需要在一行末尾使用下划线来指示一个语句被分割成多行。 |
没有分号的语句
所有C#语句末尾都要使用分号。但switch语句段就不能包含分号。因为在switch语句段中已经包含了花括号。C#不需要在语句后跟随分号。事实上,In fact, code blocks themselves are considered statements (they are also composed of statements)and don’t require closure using a semicolon
由于创建新行并不能分隔语句,你就可以将多个语句放在一行,而C#编译器将把这一行解释成多条指令。比如,清单1.5在一行内包含两个语句。分别在两行显示UP和Down
清单1.5 在一行内的多语句
———————————————————————————————————
system.Console.WriteLine(“Up”);System.Console.WriteLine(“Down”);
———————————————————————————————————
C#也允许将一个语句分割成多行。C#编译器通过查找分号来确认一个完整语句(如清单1.6所示)
清单1.6 一个语句分割成多行
———————————————————————————————————
System.COnsole.WriteLine(
"Hello. My name is Inigo Montoya”);
———————————————————————————————————
在清单1.6 原先的WriteLine()语句被分割到两行中。
空白符
分号的使用使C#编译器能够忽略代码中的空白符。除了一些特殊情况,C#允许开发者在代码中插入空白符,这并不影响语义。在清单1.5和清单1.6中,在一个语句内或两个语句间插入新行没什么关系,这这样做并不影响编译器产生的可执行文件。
什么是空白符
空白符是一个或多个连续的格式字符,比如tab,空格,换行符。显然消除单词间的空白是很有意义的,比如引号间的空白。
通常,程序员使用空白符缩进排版来增加可读性。咱来看看清单1.7和1.8的差别
清单1.7
—————————————————————————
class HelloWorld
{
static void Main()
{
System.Console.WriteLine(“Hello Inigo Montoya”);
}
}
—————————————————————————
清单1.8
—————————————————————————————
class HelloWorld{static void Main()
{System.COnsole.WriteLine(“Hello Inigo Montoya”);}}
—————————————————————————————
尽管这两个例子看起来由点不同,但C#编译器看他们是一样一样一样的。
使用空白符格式化代码
使用空白符缩进排版是增加可读性的重要方式。当你开始写代码时,你需要按照习惯和代码标准来提高代码的可读性。
本书使用的格式习惯是,花括号独自一行,在一对儿花括号中的代码需要缩进。如果花括号中还包含另一对儿花括号,则第二对儿括号中的所有代码都缩进。
这并不是C#的制式风格,不过这也是一个很优美的风格。
(本章未完)