第3章
C#语法
与其他编程语言相比,C#语言在接近人类语言方面更胜一筹,C#继承了C语言大部分的语法结构,但与C语言也有很大不同,例如C#取消了令人讨厌的指针。
3.1变量与常量
C#毕竟是程序语言,总会和日常用语有所不同,例如日常中人们会说半径为1.2米,学生人数是30,说的时候并不考虑1.2是整数还是小数,但C#是必须要考虑类型的,就因为C#考虑了类型,给初学者造成了很大困扰。记住,C#是强类型语言,变量必须经过定义才能使用。
3.1.1数值类型
C#的数值类型包括整数、实数、布尔类型等。数值类型如表31所示。
表31数值类型
C#别名.NET CTS类型范围说明
整数
sbyteSystem.SByte-128~1278位有符号整数
byteSystem.Byte0~2558位无符号整数
shortSystem.Int16-32768~3276716位有符号整数
ushortSystem.UInt160~6553516位无符号整数
intSystem.Int32-231~231-132位有符号整数
uintSystem.UInt320~232-132位无符号整数
longSystem.Int64-263~263-164位有符号整数
ulongSystem.UInt640~264-164位无符号整数
charSystem.CharUnicode字符编码16位无符号整数
实数
floatSystem.Single±1.5×10-45~±3.4×10-3832位单精度
doubleSystem.Double±5.0×10-324~±3.4×10-30864位双精度
decimalSystem.Decimal±1.0×10-28~±7.9×1028128位高精度十进制数
布尔boolSystem.Boolearntrue和false1位二进制
学过C语言的同学可能熟悉int、float、double等。初学者可能对这些数据类型感到迷惑,比如int和System.Int32究竟是什么关系,在编程中应该使用哪一个。
在.NET中,定义了通用类型系统(Common Type System,CTS),不管采用VB.NET或C#,所定义的数据类型都将被翻译成CTS类型。而我们熟悉的int、float等是属于C#语言自身独有的,int是System.Int32在C#中的别名。
我们可以认为int和System.Int32就是一回事。double和System.Double是一回事。用户愿意用哪一个是自己的爱好问题。
在实数中有一个我们不熟悉的类型decimal,它主要用于财务货币计算,可以精确地表示十进制小数,如十进制数0.003用其他类型会产生误差,而用decimal虽然也会有误差,但由于位数多达128位,因而十分精确,虽然位数多,但取值范围不如float和double大。
各种类型的数值表达如下。
1. 整数类型
整数类型分为无符号数和有符号数,这里的符号指的是负号。无符号的数就是只能取正数。一些整数类型如下:
int a=123;
long b=23L;//L可以写成l
uint c=123U;//U可以写成u
ulong d=123UL;//UL可以写成ul
如果是十六进制在数字前面加0x或0X,数字基数为0~9、A~F或a~f。
例如:
int a=0x23; //十进制35
Int b=0xAB; //十进制171
如果是decimal类型,则在数字后面加M或m,如:
decimal a=23.6M
2. char类型
char类型属于一种特殊的整数类型。它采用Unicode编码格式对每个字符都进行了编码,字符的写法是对单个字符加单引号,例如‘a’,‘A’,‘大’,‘β’等。注意单引号中只能放一个字符(转义字符除外),如‘ab’是错误的。但转义字符‘\n’是正确的,它代表“回车”,关于转义字符串后面会详述。一些字符的Unicode编码如表32所示。
表32字符的Unicode编码
字符Unicode编码(十进制整数)字符Unicode编码(十进制整数)
‘a’97‘大’22823
‘A’65‘\n’10
‘β’946
3. 实数类型
如果只写出带小数点的数据,系统默认为是double型,这是要值得注意的事。这与C语言有所不同。如果需要float型,必须在后面加F或f,否则出错,如:
double a=12.8;
floatb=12.8F; //后面必须有F或f
这些数据类型都不区分大小写。如12.8F和12.8f没有区别。
4. 工程计数法
double a=2e3; //值为2000即2×103
double b=3E-4; //值为0.0004即2×10-4
工程计数法表示的值都是double型,写成e或E都可以。
3.1.2变量定义
1. 变量定义的语法
在C#中,定义一个整型变量a,以下两种写法完全等价:
int a;
System.Int32 a;
定义变量的格式是:
类型 变量名1, 变量名2;
类型 变量名1=初值1, 变量名2=初值2;
例如:
int a, b, c;
double d;
如果要对变量赋初值,如下:
int a;
a=3;
也可以直接写成一行,如下:
int a=3;
2. 类型推断
C#支持一种叫做“类型推断”的形式来定义变量,采用关键字var,如:
var a=3; //int
var b=3.0; //double
var c=true; //bool
用var定义,变量根据右边的值自动判断数据类型。
关于变量名的定义需要注意以下事项:
变量名必须以字母或下划线开头,后面可以是字母与变量的组合,也可以是汉字。注意变量名区分大小写。
变量名不能与C#的关键字重名。C#的关键字共有七十多个,例如int、float、using等不能用作变量名。
如果非要使用关键字,可以在变量名前面加@,例如@int是一个正确的变量。
在C#中可以使用汉字,希腊字母等作为变量,例如下面的变量名是合法的:
int α,β, π;
double半径;
这些奇怪字符的使用增强了程序的可读性。
可以使用Unicode字符定义变量,用语法\uXXXX来指定,其中XXXX是Unicode字符的十六进制编码。由于字符a的Unicode十六进制码为00AA,所以下列用法等价。
int a=9;
int \u00AA=9;
声明了变量后,就不能再更改变量的类型了,例如下列语句会出现错误:
int a;
double a;
3. 变量作用域
变量的作用域为{ },如下面的代码会出错:
{
int a=5;
}
Console.Write(a);
在{ }内的变量,在{ }外不存在。
……