C#实用教程第5章Windows应用程序第4章面向对象编程进阶第3章面向对象编程基础第2章C#编程基础第1章C#快速入门C#实用教程第10章Web应用程序第9章C#多线程技术第8章数据库应用第7章文件操作第6章GDI+编程1.1C#的优势作为编程语言,C#是现代的、简单的、完全面向对象的,而且是类型安全的。重要的是,C#是一种现代编程语言。在类、名字空间、方法重载和异常处理等方面,C#去掉了C++中的许多复杂性,借鉴和修改了Java的许多特性,使其更加易于使用,不易出错。下面列举了一些C#在设计上的优点:1.1C#的优势面向对象现代性类型安全性版本处理技术C#在设计上的优点简单性简单性1.没有指针是C#的一个显著特性,用户使用一种可操控的(Managed)代码进行工作时,直接的内存存取,将是不允许的。2.在C#中不再需要记住那些源于不同处理器结构的数据类型现代性1.用户可以使用一个新的decimal数据类型进行货币计算。2.C#通过代码访问安全机制来保证安全性,根据代码的身份来源,可以分为不同的安全级别,不同级别的代码在被调用时会受到不同的限制。面向对象1.C#支持面向对象的所有关键概念:封装、继承和多态性。2.C#的继承机制只允许一个基类。如果需要多重继承,用户可以使用接口。类型安全性1.C#实施了最严格的类型安全机制来保护它自身及其垃圾收集器。2.边界检查。3.算术运算溢出检查。4.C#中传递的引用参数是类型安全的。版本处理技术C#尽其所能支持DLL版本处理功能,虽然C#自己并不能保证提供正确的版本处理结果,但它为程序员提供了这种版本处理的可能性。有了这个适当的支持,开发者可以确保当他开发的类库升级时,会与已有的客户应用保持二进制级别上的兼容性。1.2第一个C#程序首先看控制台应用程序的版本。【例1.1】在控制台窗口中输出“HelloWorld!”字样。在VisualC#.NET开发环境中新建一个控制台应用程序项目,并在源代码文件中输入如下语句:usingSystem;classHelloWorld{publicstaticvoidMain(){Console.WriteLine(HelloWorld!);}}程序运行结果下图所示。HelloWorld!将此内容保存到文件EX1_1.cs中,然后选择菜单“调试”→“启动”或直接按F5键运行此程序。也可以不使用VisualC#.NET环境,直接用文本编辑工具输入以上代码,并且保存到Helloworld.cs文件中,再通过开始菜单的“程序”→“MicrosoftVisualStudio2005”→“VisualStudioTools”→“VisualStudio2005命令提示”打开命令行窗口,在命令窗口中输入:csc/target:exeEX1_1.cs程序运行结果如图1.1所示。HelloWorld!下面再看Windows应用程序的版本。【例1.2】弹出一个消息对话框显示“HelloWorld!”字样。用“Windows应用程序”模板建立项目,或者使用文本编辑工具输入源代码如下:usingSystem;usingSystem.Windows.Forms;classHelloWorld{publicstaticvoidMain(){MessageBox.Show(HelloWorld,MessagefromC#);}}这次需要增加对System.Windows.Forms命名空间的引用,选择菜单“项目”→“添加引用…”打开“添加引用”对话框,在列表中找到并选中“System.Windows.Forms.dll”,然后单击“选择”按钮,最后单击“确定”按钮完成添加。将文件另存为EX1_2.cs,在开发环境中按F5键编译运行程序,如果用命令行方式编译请参照控制台版,编译命令如下:csc/target:winexeEX1_2.cs程序的运行结果如图1.2所示。通过上述两段代码来认识C#:1.代码最前面是以using关键字开始的命名空间导入语句,然后是使用class关键字对类HelloWorld的定义。2.命名空间是为了防止相同名字的不同标识符发生冲突而设计的隔离机制。3.在.NET框架类库中提供的不同组件都被包含在一定的命名空间中,所以要使用这些组件也必须通过using关键字开放相应的命名空间,使得相应的标识符对编译器可见,如果没有使用using关键字,那么相应的标识符就应包含完整的空间路径。4.由于C#是一种完全的面向对象的语言,所以不会有独立于类的代码出现,应用程序的入口也必须是类的方法,C#规定命名为Main的方法作为程序的入口5.C#是一种大小写敏感的语言!!第2章C#编程基础C#的基本数据类型、变量、常量、表达式、程序流程控制语句及数组等概念是C#程序设计的基础,掌握这些基本知识是编写正确程序的前提。2.1基本类型C#的基本数据类型、变量、常量、表达式、程序流程控制语句及数组等概念是C#程序设计的基础,掌握这些基本知识是编写正确程序的前提。第2章C#编程基础C#的基本数据类型、变量、常量、表达式、程序流程控制语句及数组等概念是C#程序设计的基础,掌握这些基本知识是编写正确程序的前提。2.2.1值类型所谓值类型就是一个包含实际数据的量。当定义一个值类型的变量时,C#会根据它所声明的类型,以堆栈方式分配一块大小相适应的存储区域给这个变量,随后对这个变量的读/写操作就直接在这块内存区域进行。.例如:intiNum=10;//分配一个32位内存区域给变量iNum,并将10放入该内存区域iNum=iNum+10;//从变量iNum中取出值,加上10,再将计算结果赋给iNum图2.1值类型操作示意图表2.1C#简单类型C#关键字.NETCTS类型名说明范围和精度boolSystem.Boolean逻辑值(真或假)true,falsesbyteSystem.SByte8位有符号整数类型128~127byteSystem.Byte8位无符号整数类型0~255shortSystem.Int1616位有符号整数类型32768~32767ushortSystem.UInt1616位无符号整数类型0~65535intSystem.Int3232位有符号整数类型2147483648~2147483647C#中的值类型包括:简单类型、枚举类型和结构类型。续表C#关键字.NETCTS类型名说明范围和精度uintSystem.Uint3232位无符号整数类型0~4294967295longSystem.Int6464位有符号整数类型9223372036854775808~9223372036854775807ulongSystem.UInt6464位无符号整数类型0~18446744073709551615charSystem.Char16位字符类型所有的Unicode编码字符floatSystem.Single32位单精度浮点类型(大约7个有效十进制数位)doubleSystem.Double64位双精度浮点类型(大约15~16个有效十进制数位)decimalSystem.Decimal128位高精度十进制数类型(大约28~29个有效十进制数位)表中“C#关键字”是指在C#中声明变量时可使用的类型说明符。2.1.2引用类型引用类型包括class(类)、interface(接口)、数组、delegate(委托)、object和string。其中object和string是两个比较特殊的类型。object是C#中所有类型(包括所有的值类型和引用类型)的根类。string类型是一个从object类直接继承的密封类型(不能再被继承),其实例表示Unicode字符串。一个引用类型的变量不存储它们所代表的实际数据,而是存储实际数据的引用。引用类型分两步创建:首先在堆栈上创建一个引用变量,然后在堆上创建对象本身,再把这个内存的句柄(也是内存的首地址)赋给引用变量。例如:strings1,s2;s1=ABCD;s2=s1;其中,s1、s2是指向字符串的引用变量,s1的值是字符串''ABCD''存放在内存的地址,这就是对字符串的引用,两个引用型变量之间的赋值,使得s2、s1都是对''ABCD''的引用,如图2.2所示。图2.2引用类型赋值示意引用类型的值是引用类型实例的引用,特殊值null适用于所有引用类型,它表明没有任何引用的对象。当然也可能有若干引用类型的变量同时引用一个对象的实例,对任何一个引用变量作出修改都会导致该对象的值的修改。注意:堆栈是按先进后出(FILO)的原则存储数据项的一种数据结构;堆(heap)则是用于动态内存分配的一块内存区域,可以按任意顺序和大小进行分配和释放。C#中,值类型就分配在堆栈中,堆栈内存区域内保存着值类型的值,内存区域可以通过变量名来存取。引用类型分配在堆中,对象分配在堆时,返回的是地址,这个地址被赋值给引用。可以把值类型与引用类型的值赋给object类型变量,C#用“装箱”和“拆箱”来实现值类型与引用类型之间的转换。“装箱”就是将值类型包装成引用类型的处理过程。当一个值类型被要求转换成一个object对象时,“装箱”操作自动进行,它首先创建一个对象实例,然后把值类型的值复制到这个对象实例,最后由object对象引用这个对象实例。2.1.3值类型与引用类型的关系例如:usingSystem;classDemo{publicstaticvoidMain(){intx=123;objectobj1=x;//装箱操作x=x+100;//改变x的值,此时obj1的值并不会随之改变Console.WriteLine(x={0},x);//x=223Console.WriteLine(obj1={0},obj1);//obj1=123}}该实例的“装箱”操作说明如图2.3所示。该实例的“装箱”操作说明如图2.3所示。“拆箱”操作与“装箱”相反,它是将一个object类型转换成值类型。首先检查由object引用的对象实例值类型的包装值,然后把实例中的值复制到值类型的变量中。注意:当一个“装箱”操作把值类型转换为一个引用类型时,不需要显式地强制类型转换;而拆箱操作把引用类型转换到值类型时,由于它可以强制转换到任何可以相容的值类型,所以必须显式地强制类型转换。usingSystem;classDemo{publicstaticvoidMain(){intx=123,y;objectobj1=x;//装箱操作x=x+100;//改变x的值,此时obj1的值并不会随之改变y=(int)obj1;//拆箱操作,必须进行强制类型转换Console.WriteLine(x={0},x);//x=223Console.WriteLine(obj1={0},obj1);//obj1=123}}2.2变量与常量C#的基本数据类型、变量、常量、表达式、程序流程控制语句及数组等概念是C#程序设计的基础,掌握这些基本知识是编写正确程序的前提。2.2.1常量常量,顾名思义就是在程序运行期间其值不会改变的量,它通常可以分为字面常量和符号常量。常量及其使用非常直观,以能读懂的固定格式表示固定的数值,每一种值类型都有自己的常量表示形式。对于一个整数值,默认的类型就是能保存它的最小整数类型,其类型可以分为int、uint、long或ulong。如果默认类型不是想要的类型,可以在常量后面加后缀(U或L)来明确指定其类型。在常量后面加L或l(不区分大小写)表示长整型。例如:32//这是一个int类型32L//这是一个long类型在常量后面加U或u(不区分大小写)表示无符号整数。例如:128U//这是一个uint类型128UL//这是一个ulong类型整型常量既可以采用十进制也可以采用十六进制,不加特别说明默认为十进制,在数值前面加0x(或0X)则表示十六进制数,十六进制基数用0~9、A~F(或a~f),例如:0x20//十六进制数20,相当于十进制数320x1F//十六进制数1F,相当于十进制数311.整数常