Return语句等价于C++和Java中的return,也等价于Visual Basic中的Exit Sub或Exit Function。
C#有两个方法可确保变量在使用前进行了初始化:
● 变量是类或结构中的字段,如果没有显式初始化,创建这些变量时,其值就默认是0(类和结构在后面讨论)。
● 方法的局部变量必须在代码中显式初始化,之后才能在语句中使用它们的值。此时,初始化不是在声明该变量时进行的,但编译器会通过方法检查所有可能的路径,如果检测到局部变量在初始化之前就使用了它的值,就会产生错误。
类型推断使用var关键字。声明变量的语法有些变化。编译器可以根据变量的初始化值"推断"变量的类型。
int someNumber=0;
=====
var someNumber=0;
需要遵循一些规则。变量必须初始化。否则,编译器就没有推断变量类型的依据。初始化器不能为空,且必须放在表达式中。不能把初始化器设置为一个对象,除非在初始化器中创建了一个新对象。
声明了变量,推断出了类型后,变量的类型就不能改变了。这与Visual Basic 中使用的Variant类型不同。变量的类型建立后,就遵循其他变量类型遵循的强类型化规则。
变量的作用域是可以访问该变量的代码区域。一般情况下,确定作用域有以下规则:
● 只要类在某个作用域内,其字段(也称为成员变量)也在该作用域内(在C++、Java和Visual Basic中也是这样)。
● 局部变量存在于表示声明该变量的块语句或方法结束的封闭花括号之前的作用域内。
● 在for、while或类似语句中声明的局部变量存在于该循环体内(C++程序员注意,这与C++的ANSI标准相同。Microsoft C++编译器的早期版本不遵守该标准,在循环停止后这种变量仍存在)。
常量具有如下特征:
● 常量必须在声明时初始化。指定了其值后,就不能再修改了。
● 常量的值必须能在编译时用于计算。因此,不能用从一个变量中提取的值来初始化常量。如果需要这么做,应使用只读字段(详见第3章)。
● 常量总是静态的。但注意,不必(实际上,是不允许)在常量声明中包含修饰符static。
在程序中使用常量至少有3个好处:
● 常量用易于理解的清楚的名称替代了含义不明确的数字或字符串,使程序更易于阅读。
● 常量使程序更易于修改。例如,在C#程序中有一个SalesTax常量,该常量的值为6%。如果以后销售税率发生变化,把新值赋给这个常量,就可以修改所有的税款计算结果,而不必查找整个程序,修改税率为0.06的每个项。
● 常量更容易避免程序出现错误。如果要把另一个值赋给程序中的一个常量,而该常量已经有了一个值,编译器就会报告错误。
值类型和引用类型
从概念上看,其区别是值类型直接存储其值,而引用类型存储对值的引用。C#中的值类型基本上等价于Visual Basic或C++中的简单类型(整型、浮点型,但没有指针或引用)。引用类型与Visual Basic中的引用类型相同,与C++中通过指针访问的类型类似。
这两种类型存储在内存的不同地方:值类型存储在堆栈中,而引用类型存储在托管堆上。
object类型执行许多一般用途的基本方法,包括Equals()、GetHashCode()、GetType()和ToString()。
从长远来看,创建枚举可以节省大量的时间,减少许多麻烦。使用枚举比使用无格式的整数至少有如下三个优势:
● 如上所述,枚举可以使代码更易于维护,有助于确保给变量指定合法的、期望的值。
● 枚举使代码更清晰,允许用描述性的名称表示整数值,而不是用含义模糊的数来表示。
● 枚举使代码更易于键入。在给枚举类型的实例赋值时,Visual Studio IDE会通过IntelliSense弹出一个包含可接受值的列表框,减少了按键次数,并能够让我们回忆起可选的值。
在C#中,枚举的真正强大之处是它们在后台会实例化为派生于基类System.Enum的结构。
命名空间与程序集无关。同一个程序集中可以有不同的命名空间,也可以在不同的程序集中定义同一个命名空间中的类型。
命名空间的别名
using关键字的另一个用途是给类和命名空间指定别名。如果命名空间的名称非常长,又要在代码中使用多次,但不希望该命名空间的名称包含在using指令中(例如,避免类名冲突),就可以给该命名空间指定一个别名,其语法如下:
using alias=NamesapceName;
Main()方法
本章的开头提到过,C#程序是从方法Main()开始执行的。这个方法必须是类或结构的静态方法,并且其返回类型必须是int或void。
多个Main()方法
但是,可以使用/main选项,其后跟Main()方法所属类的全名(包括命名空间),明确告诉编译器把哪个方法作为程序的入口点:
csc MainExample.cs /main:Wrox.ProCSharp.Basics.MathExample
给Main()方法传送参数
前面的例子只介绍了不带参数的Main()方法。但在调用程序时,可以让CLR包含一个参数,将命令行参数转送给程序。这个参数是一个字符串数组,传统称为args(但C#可以接受任何名称)。在启动程序时,可以使用这个数组,访问通过命令行传送过来的选项。
C#预处理器指令
#define和 #undef
#if, #elif, #else和#endif
#warning和#error
#region和#endregion
#line
#pragma