本章内容
ü 基本数据类型
ü 操作符
ü 流程控制
ü 数组
ü 结构、枚举类型和类
ü 委托和事件
本章内容不是全面介绍C#语言,而是对C#语言进行一个总结。假定读者已经对C#语言已经了解,详细的C#资料可参看微软的.NET SDK的文档。
请读者原谅我加上这一章,之所以这样是因为我想对C#语言的一些功能点做一些总结,尽量以图表的方式展示这些功能点。我也买过很多书,java和.net的,很多书的前4、5章的内容基本相同,都是介绍开发语言的。我们读者哪有那么多银子区买这些重复的东西呢?
4.1基本数据类型
C#定义了十三种简单类型,下面的表是对这些类型做了比较。
C#关键字
|
框架类型
|
占用字节(位)
|
范围
|
sbyte
|
System.SByte
|
8
|
-128到127
|
byte
|
System.Byte
|
8
|
0到255
|
short
|
System.Int16
|
16
|
-32768到32767
|
ushort
|
System.UInt16
|
16
|
0到65535
|
int
|
System.Int32
|
32
|
-2147483648到2147483647
|
uint
|
System.UInt32
|
32
|
0到4294967295
|
long
|
System.Int64
|
64
|
-9223372036854775808到9223372036854775807
|
ulong
|
System.UInt64
|
64
|
0到18446744073709551615
|
char
|
System.Char
|
32
|
所有Uniccode字符
|
float
|
System.Single
|
32
|
约(±)1.5×
10
-45到
7.9×3.4×10
38
|
double
|
System.Double
|
64
|
约(±)5.0×
10
-324到
7.9×10×10
28
|
decimal
|
System.Decimal
|
128
|
8
|
bool
|
System.Boolean
|
1
|
true 或者false
|
我们通过一个例子来查看各个类型的最大最小值。
Console.WriteLine("SByte:MaxValue=" + SByte.MaxValue + ",MinValue=" + SByte.MinValue);
Console.WriteLine("Byte:MaxValue=" + Byte.MaxValue + ",MinValue=" + Byte.MinValue);
Console.WriteLine("Int16:MaxValue=" + Int16.MaxValue + ",MinValue=" + Int16.MinValue);
Console.WriteLine("UInt16:MaxValue=" + UInt16.MaxValue + ",MinValue=" + UInt16.MinValue);
Console.WriteLine("Int32:MaxValue=" + Int32.MaxValue + ",MinValue=" + Int32.MinValue);
Console.WriteLine("UInt32:MaxValue=" + UInt32.MaxValue + ",MinValue=" + UInt32.MinValue);
Console.WriteLine("Int64:MaxValue=" + Int64.MaxValue + ",MinValue=" + Int64.MinValue);
Console.WriteLine("UInt64:MaxValue=" + UInt64.MaxValue + ",MinValue=" + UInt64.MinValue);
Console.WriteLine("Char:MaxValue=" + Char.MaxValue + ",MinValue=" + Char.MinValue);
Console.WriteLine("Char:MaxValue=" + Char.MaxValue + ",MinValue=" + Char.MinValue;
Console.WriteLine("Single:MaxValue=" + Single.MaxValue + ",MinValue=" + Single.MinValue);
Console.WriteLine("Double:MaxValue=" + Double.MaxValue + ",MinValue=" + Double.MinValue);
Console.WriteLine("Decimal:MaxValue=" + Decimal.MaxValue + ",MinValue=" + Decimal.MinValue);
Console.WriteLine("Boolean:TruString=" + Boolean.TrueString + ",FalseString=" + Boolean.FalseString);
运行此程序,显示结果如下:
据Mono文档介绍,Char类型的最大值为65535,最小值为0。不过这里显示是乱码。这是因为这两个值的类型都是char。我们可以通过下面的代码片段将其转换成double,终端中将显示最大值65535和最小值0:
double maxValue = Convert.ToInt32(Char.MaxValue);
double maxValue = Convert.ToInt32(Char.MinValue);
Consloe.WriteLine(“Char:MaxValue=” +maxValue + “,MinValue=” + minValue);
这13种类型都是值类型,值类型和引用类型的区别在下面介绍。这里如何区分值类型和引用类型呢?
区分值类型和引用类型是相当重要的,尤其在对方法的参数进行判断的时候很容易出错。值类型都继承于System.ValueType和它的子类,如结构类型和枚举类型。
考虑下面的一个例子。
using System;
public class ValueandRef
{
public class Person
{
public string name;
public int age;
public Person()
{
}
public Person(string p1,int p2)
{
name=p1;
age=p2;
}
}
//引用类型
Person person = new Person("xuwen",32);
//值类型
int salary = 12000;
//打印person和salary的值
public void PrintInfo()
{
Console.WriteLine(person.name + "'s age:" + person.age);
Console.WriteLine(person.name + "'s salary:" + salary);
}
//更改数值,p1参数是引用类型,p2参数是值类型
public void ChangedValue(Person p1,int p2)
{
//这里p1设置为新对象,p1的地址不再指向person,而是指向了一个新的Person。
p1 = new Person();
p1.name ="yuer"; //这里对值的修改只影响新的对象的值,person的值不被修改
p1.age = 23;
p2 = 5400;//值类型,这里的修改不会影响salary
}
public void ChangedValueTwo(Person p1,int p2)
{
p1.name = "hutu"; //这里p1和person是同一对象
p1.age =27;
p2 = 7200; //值对象,这里的修改不会影响salary
}
public void Test()
{
Console.WriteLine("PrintInfo:Before the first changed");
PrintInfo();
Console.WriteLine("PrintInfo:after the first changed");
ChangedValue(person,salary);
PrintInfo();
Console.WriteLine("PrintInfo:after the second changed");
ChangedValueTwo(person,salary);
PrintInfo();
}
public static void Main(string[] args)
{
ValueandRef vandr = new ValueandRef();
vandr.Test();
}
}
编译运行这个程序,显示结果如下:
这里Person是引用类型,int是值类型。
常用转义符号:
转义符号
|
代表的意思
|
Unicode值
|
\’
|
单引号
|
\u0027
|
\”
|
双引号
|
\u0022
|
\\
|
反斜杠
|
\u005C
|
\0
|
null
|
\u0000
|
\a
|
Alert
|
\u0007
|
\b
|
空格
|
\u0008
|
\f
|
换页
|
\u000C
|
\n
|
新行
|
\u000A
|
\r
|
回车
|
\u000D
|
\t
|
水平tab
|
\u0009
|
\v
|
竖直tab
|
\u000B
|
字符串格式化规则:
String.Format和WriteLine使用相同的字符串格式化规则。指定格式的表达式为:
“{N[,M][:FormatString]}”,…,arg0………。
其中N指定要格式化的参数的整型数,从0开始编号。
M是可选的整型数,它指定包含格式化数值的区域的宽度,剩余空间由空格填充。如果M是负数,那么格式化数值被左对齐,否则右对齐。
FormatString是格式化指定符。
arg0…是指要格式化的字符串。
如:Console.WriteLine(“{0:D3}”,834);
标准格式指示符如下:
字符(不区分大小写)
|
意义
|
c
|
货币数值
|
d
|
十进制
|
e
|
指数
|
f
|
固定点
|
g
|
常规
|
n
|
带千分号的数字,如1,000,000
|
p
|
带百分号的数字
|
r
|
可恢复
|
x
|
十六进制
|
自定义格式指示符:
格式符
|
用途
|
说明
|
0
|
显示零占位符
|
补零
|
#
|
显示数字占位符
|
使用有效数字替换#
|
.
|
小数点
|
.
|
,
|
千分符号
|
如1,000,000
|
%
|
百分比表示
|
显示%
|
E+0
E-0
e+0
e-0
|
指数
|
指数格式化
|
\
|
字符字面值
|
显示格式字符
|
‘XYZ’
“XYZ”
|
字符串字面值
|
显示引号内的字符串
|
;
|
节分隔符
|
日期类型的格式化符:
格式字符
|
日期模式
|
说明
|
d
|
MM/dd/yyyy
|
短日期模式
|
D
|
dddd.MMMM dd,yyyy
|
长日期模式
|
t
|
HH:mm
|
短时间模式
|
T
|
HH:mm:ss
|
长时间模式
|
f
|
dddd,MMMM dd,yyyy HH:mm
|
完整日期/时间模式(短时间)
|
F
|
dddd,MMMM dd,yyyy HH:mm:ss
|
完整日期/时间模式(长时间)
|
g
|