C#基本语法简介
一、系统数据类型和C#简化符号
和各任何编程语言一样,C#定义了一组内建数据类型。每种类型都有对应的C#关键字、取值范围和作用,如系统类型中表示真实的或者虚假的类型为System.Boolean,C#简化符号为bool,范围true或false;又如uint对应的系统类型是System.UInt32,范围0~4294967295,代表一个无符号的32位数。其中bool是遵循CLS(公共语言规范),而uint则不遵循CLS(符合CLS的.NET代码可以被任何托管编程语言使用,不止是C#,还有VB.NET和托管C++等)。
C#内建的系统型有15个,请查看.NET Framework 3.5文档来熟悉它们。
二、变量声明和初始化。
如果要声明一个数据类型作为变量,可以通过在变量名之前指定类型来实现,还可以使用全名分配数据类型。如:
bool mybool = false;
string myString;
myString = "This is a string.";
System.Int32 i1 = 0, i2, i3 = 56;
在使用变量前必须先对变量赋值,否则会收到一个编译错误(如上文加上" i2 = i2 +5 ",是不能通过编译的)。内建数据类型还支持构造函数(对于构造函数,后面章节会有介绍),这不允许我们使用new关键字来创建变量,它将变量自动设置为其默认值:
int i4 = new int(); // i4设置为0。
i4 = i4 + 5 ; // i4现在的值为5。
三、数据转换
不同类型的数据是可以转换的。
按转换前后的数据的位数变化可分为窄化转换和宽化转换:当一种类型的值转换为大小相等或更大的另一类型时,则发生宽化转换(也叫扩大转换);当一种类型的值转换为较小的另一种类型时,则发生窄化转换(也叫收缩转换)。宽化转向不会导致数据丢失,因此允许隐式进行。但窄化转换因为有数据丢失的风险(称为溢出),将导致编译错误。如果希望通知编译器我们想要处理窄化运算引起的可能的数据丢失,就必须使用C#强制转换运算符()来进行显式强制转换:
byte myByte = 0;
int myInt = 200;
myByte = (byte)myInt;
如果我们在构建一个不能接受数据丢失的应用程序,C#提供的checked关键字将确保数据丢失肯定会被检测到。
myByte = checked(byte)myInt;
如果发生数据丢失,将发生一个运行时异常(对于异常,后面将深入讨论)。另外,C#编译器还提供/checked标志,可以设定项目级别的溢出检测。与checked相对的还有unchecked关键字,请查阅相关文档进行了解。
四、运算符
C# 提供大量运算符,这些运算符是指定在表达式中执行哪些操作的符号。通常允许对枚举进行整型运算,例如 ==、!=、<、>、<=、>=、^、&、|、~、++、-- 和 sizeof()。此外,很多运算符可被用户重载,由此在应用到用户定义的类型时更改这些运算符的含义。各运算符的用法及优先级,请查阅相关文档。
新增的运算符??:如果 ?? 运算符的左操作数非 null,该运算符将返回左操作数,否则返回右操作数。
另一个新增的Lambda运算符(=>)会在后面章节中讲述。
五、流程控制
1.C#迭代结循环构
除了基本的for循环,while循环及do/while循环,C#还允许通过使用foreach关键字遍历数组中的所有项:
string[] carTypes = {"Ford","BMW","Yugo","Honda"};
foreach(string c in carTypes)
Console.WriteLine(c);
2.C#条件结构
if/else语句。C和C++的程序员要注意,C#中的if/else语句只能作用于布尔表达式,不能用于诸如-1、0这样的值。
switch语句。C#switch语句一个不错的特性是,除了数值数据之处,我们还可以运算字符串数据: