1、C#基础之重点纲要C#简介-什么是C# C#是可用于创建运行在.NET CLR上的应用程序语言之一,它从C和C+语言演化而来,是microsoft专门为使用.NET平台而创建的。因为C#是近期发展起来的,所以吸取了以前的教训,考虑了其他语言的许多有点,并解决了它们的问题。使用C#开发应用程序比使用C+简单,因为其语法比较简单。但是,C#是一种强大的语言,在C+中能完成的任何利用C#也能完成。C#代码通常比C+略长一些。这是因为C#是一种类型安全的语言(与C+不同)。在外行人看来,这表示一旦为某些数据指定了类型,就不能转换为另一个不相关的类型。所以,在类型之间转换时,必须遵守严格的规则。执行相同
2、的任务时,用C#编写的代码也比C+长。但C#代码更加健壮,调试也比较简单。C#简介-什么是.NET Framework .NET Framework是microsoft为开发应用程序而创建的一个富有革命性的新平台。尽管.NET Framework现在的版本要运行在woindows操作系统上,但一位将推出运行在其他操作系统上的版本,例如mono,包括各种linux版本合mac OS。另外还可以在个人数字助手(PDA)类设备合一些智能电话上使用。.NET Framework可以创建windows应用程序、web应用程序、web服务合其他各种类型的应用程序。.NET Framework的设计方式保证
3、它可以使用各种语言,C+/vb/j#/甚至一些旧的语言等。当然重点还是我们的C#,毕竟它是microsoft专门为.NET Framework设计的程序设计语言。为了执行C#代码,必须把它们转换为操作系统能够理解的语言,即本机代码,这种转换的过程称为编译代码,由编译器执行。在.NET Framework下分为两个阶段。首先,在编译使用.NET Framework库的代码时,不是立即创建操作系统特定的本机代码,而是把代码编译为Microsoft中间语言(Microsoft Intermediate Language,MSIL)代码,这些代码是可以跨平台的。显然,要执行应用程序这些是不够的,还需要
4、进行二次编译。就是刚上述说的MSIL中间代码编译为用于OS和目标及其结构的本机代码。这样OS才能执行应用程序。程序集在编译应用程序时,所创建的MSIL代码被存储在一个程序集中,程序集包括可执行的应用程序文件(这些文件可以在windows上运行,不需要其他程序,扩展名是.exe)和其他应用程序使用的库(其扩展名是.dll)。除了包含MSIL外,程序集还包含元信息(即程序集中包含的数据的信息,也称为元数据)和可选的资源(MSIL使用的其他数据,例如声音文件和图片)。元信息可以把需要的数据添加到系统注册表中,而这种情形在使用其他平台进行开发时常常不能够实现。托管代码在把代码编译为MSIL,再用编译器
5、把它编译为本机代码后,CLR(公共语言运行库)的任务还没有完全完成。用.NET Framework编写的代码在运行(runtime)是托管的。即CLR会管理这应用程序的内存、处理安全性、允许进行跨语言调试等。垃圾回收托管代码最重要的一个功能是垃圾回收(garbage collection)。这可以确保应用程序不再使用某些内存时,这些内存就会被完全释放。不像与以前,这项工作主要由程序员负责,代码中的几个简单错误就会把大块内存分配到错误的地方,使这些内存神秘失踪。这通常让计算机的速度逐渐变慢,甚至导致系统崩溃。这里需要注意的事,因为这项工作在不可预知的时间进行,所以在设计应用程序时,必须记得要进行
6、这样的检查。毕竟它没有很人性化,需要许多内存才能运行的代码应自己执行这样的检查,而不是坐等垃圾回收,呵呵。把它们组合在一起在继续学习之前,先总结一下上述创建.NET应用程序所需要的步骤:1、使用某种.NET兼容语言(如C#)编写好应用程序代码。2、把代码编译为MSIL(中间语言),并存储在程序集中。3、执行代码,将MSIL编译为本机代码。4、在托管的CLR环境下运行本机代码,执行应用程序。编写C#程序-控制台应用程序 试试看,创建一个简单的控制台应用程序:1、选择File|New|Project.菜单项,创建一个新的控制台应用程序项目。2、在所显示窗口的Project Types:窗格中选择V
7、isual C#节点,在Temlpates:窗格中选择Console Application项目类型。当然你也可以自定义保存项目的路径。3、单击OK按钮完成创建。4、初始化项目后,在主窗口显示的文件里添加如下代码行:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceConsoleApplication1classProgramstaticvoidMain(stringargs)/outtexttothescreen.Console.WriteLine(hello!);Console.ReadKey();
8、5、选择Debug|Start菜单项。稍后就会在cmd窗口中显示“hello!”字样的结果。6、按下任意键,退出应用程序。现在不仔细研究这个项目使用的代码,而关心如果使用VS启动和运行代码。可以看出,VS做了许多工作,大大简化了编译和执行代码的过程。执行这些简单的步骤还有多种方式。例如在创建一个新项目时也可以按下纯ctrl+shift+n,还可以单击工具栏上相应的图标。编写C#程序-Windows Application应用程序 通常把代码当做Windos应用程序的一部分来说明,要比通过控制台窗口或命令行提示简单一些。下面用户界面构成块来组合一个用户界面。现在介绍建立用户界面的基础知识,说明如
9、何启动和运行windows应用程序,但并不详细讨论应用程序实际完成的工作。试试看,创建一个简单的Windows应用程序:1、在以前的位置创建一个类型为Windows Application的新项目,其默认名称是WindowsApplication1。2、单击OK,创建项目后,应该会看到一个空白的windows窗体。把鼠标指针移到屏幕左边的Toolbox栏上,然后找到windows forms选项卡上的button选项双击,就会在应用程序的主窗体(form1)上添加一个按钮。3、双击刚才添加到窗体中的按钮。4、现在应显示Form1.cs中的C#代码。进行如下修改:private void but
10、ton1_Click(object sender, EventArgs e) MessageBox.Show(hello!); 5、运行应用程序。6、单击显示出来的按钮,打开一个消息对话框,显示信息“hello!”。7、像每个标准的windows应用程序那样,单击右上角的x,退出应用程序。VS又一次完成了许多工作,刚才创建的应用程序与其他窗口的行为方式相同可以移动、重新设置其大小、最小化等。我们不必编写任何代码,它就可以工作。我们添加的按钮也是这样。双击按钮,VS就知道我们像添加一些代码,当程序运行时,用户单击按钮,就执行我们编好的代码。只要提供了这段代码,就可以得到按钮单击的所有功能。变量和
11、表达式-C#基本语法 计算机程序最基本的描述也许是一系列处理数据的操作,即使是最复杂的实例,这个论述也是正确的。应用程序的用户虽然看不到它们,但这些操作总是在后台上进行。我们在屏幕上进行的任何操作,无论是移动鼠标指针,单击图标,或在子处理器上输入文本,都会改变内存中的数据。如果说计算机程序是在对数据执行操作,这说明我们需要某种存数数据的方式,以及处理它们的一些方法。这两种功能是由变量和表达式提供的。在开始之前,应先了解一下C#编程的基本语法,因为我们需要一个环境来学习使用C#语言中的变量和表达式。C#代码的外观和操作方式与C+和Java非常类似。初看起来,其语法可能比较混乱,不像书面英语和其他
12、语言。但是,在C#编程中,使用的样式是比较清晰的,不用花太多力气就可以编写出刻度性很强的代码。C#编译器不考虑空格、回车符或tab字符等空白字符。这样格式化代码时又很大的自由度,但遵循某些规则将有助于提高代码的可读性。C#是一个块结构语言,所有的语句都是代码块的一部分。这些块用花括号来界定,代码块可以包含任意多行语句,或者根本不包含语句。简单的C#代码块如下所示:;其中部分并不是真正的C#代码,而是用这个文本作为C#语句的占位符。注意这段代码中,第2、3行代码是同一个语句的第一部分。这个简单的代码块中,还使用了缩进格式,使C#代码的可读性更高。这是一个标准规则,VS也会自动缩进代码。通常每个代
13、码块都有自己的缩进级别。;前面代码的续行通常也要缩进的多一些,如上面第一个实例中的第3行代码。这种样式并不是强制的,但如果不使用它,将大大降低可读性。C#代码中,另一个常见的语句是注释。注释并不是严格意义上的C#代码。注释就是解释,即给代码添加描述性文本,编译器会忽略这些内容。C#注释方法有三种,可以在注释的开头加上“/*”,在末尾加上“*/”。这些注释符号可以在单独一行上,也可以在不同的行赏。/* This is a comment*/* And so. is this!*/但下面的语句是错误的:/* Commnets often end with */ characters */注释结束符
14、号后的内容会被视为C#代码,因此产生错误。另一个添加注释的方法使用“/”开始一个注释,但它的注释范围是一行。下面的语句是正确的:/This is a different sort of commnet但下面的语句会失败,因为第二行代码会解释为C#代码:/ So is this,but this bit isnt.还有第三类注释,严格的说,这是/语法的扩展。它们都是单行注释,用三个“/”符号来开头,而不是两个。/ A special comment正常情况下,编译器会户忽略它们,但可以配置VS在编译项目时,提取这些注释后面的文本,创建一个特殊格式的文本文件,该文件可用于创建文档说明书。另外,C#
15、代码是区分大小写的。与其他语言不同,必须使用正确的大小写形式输入代码。看看下面的这行代码,它将在后面的一个示例中使用: Console.WriteLine(The first app in Beginning C# Programming!);C#编译器能够理解这行代码,因为Console.WriteLine()命令的大小写形式是正确的。一旦出现大小写拼写错误,语句都不能工作!变量和表达式-C#控制台应用程序的基本结构 下面来看一个控制台应用程序示例(ConsoleApplication1),研究一下它的结构。其代码如下所示:usingSystem;usingSystem.Collection
16、s.Generic;usingSystem.Text;namespaceConsoleApplication1classProgramstaticvoidMain(stringargs)/outtexttothescreen.Console.WriteLine(hello!);Console.ReadKey(); 可以立即看出,上一节讨论的所有语法元素这里都有。其中有分好、花括号、注释和适当的缩进。看一下代码中最重要的部分:staticvoidMain(stringargs)1011/outtexttothescreen.12Console.WriteLine(hello!);13Consol
17、e.ReadKey();14在运行控制台应用程序时,就运行这段代码,更准确的说,是运行花括号中的代码块。注释行不做任何事情。其他两行代码在控制台窗口中输出了一些文本,并等待一个响应。目前我们不必关心它的具体机制。变量和表达式-变量 变量关系到数据的存储。实际上,可以把计算机内存中的变量看作架子上的盒子。在这些盒子中,可以放入一些东西,当然也可以再把它们取出来,或者只是看看盒子里是否有东西。变量也是这样,数据可放在变量中,可以从变量中取出数据或查看它们。尽管计算机中的所有数据都是一样的东西(一组0和1),但变量有不同的含义,成为类型。就比如虽然都是盒子,但盒子有不同的形状和尺寸。某些东西只适合放
18、特定的盒子中。建立这个类型系统的原因是,不同类型的数据需要用不同的方法来处理。变量限定为不同的类型,可以避免混淆它们。例如,组成数字图片的0和1序列与组成声音文件的0和1序列的处理方式是不同的。C#中,要使用变量,需要声明它们。即给变量指定名称和类型。声明之后就可以放数据了。如下所示: ;注意,未声明的变量,代码不会被编译。那么我们该如何使用类型呢?实际上,可以使用的变量类型是无限多的。其原因是可以自定义类型存储各种复杂的数据。但总有一些数据类型是必要的,例如存储数值的变量。因此我们应了解一些简单的默认的数据类型。变量和表达式-简单的数据类型 简单的数据类型就是组成应用程序中最基本的部件类型。
19、例如数值和布尔值(true或false)。几个简单的数据类型还可以组成比较复杂的类型。大多数简单类型都是存储数值的。而且不止一种。数值类型过多的原因是在计算机内存中,把数字作为一系列的0和1来存储的机制。对于整数值,用一定的位。如果超过这个位就不能存储在这个变量中。例如,有一个变量存储了2位,在证书和表示该证书的位之间的映射如下所示:0=001=012=103=11要存储更大的数,就要有更多的位(例如,3位可以存储0-7的数)。为了更加规范的整合存储的位所占用的内存,许多不同的整数类型可以用于存储不同范围的数值,从而占用不同的内存空间(最多64位),如下所示:sbyte:在-128127之间的
20、整数byte:在0255之间的整数short:在-3276832767之间的整数ushort:在065535之间的整数int:在-21474836482147483647之间的整数uint:在04294967295之间的整数long:在-92233720368547758089223372036854775807之间的整数ulong:在0184*709551615之间的整数注意,“u”是unsigned的缩写,表示不能在这些类型的变量中存储负号。当然,除了整数以外,还可以存储浮点数,它们不是整数。可以使用的浮点数类型有3种:float,double和decimal。float:近似最小值1.5
21、*10(-45)/近似最大值3.4*10(38)double:近似最小值5.0*10(-324)/近似最大值1.7*10(308)decimal:近似最小值1.0*10(-28)/近似最大值7.9*10(28)除了数值类型外,还有另外三种简单类型:char:一个Unicode字符,存储065535之间的整数bool:布尔值,true或falsestring:一组字符组成string的字符数没有上限,因为它可以使用可变大小的内存。布尔类型bool是C#中最常用的一种变量类型,类似的类型在其他语言的代码中非常丰富。当编写应用程序的逻辑流程时,一个可以是true或false的变量可以产生分支作用。例
22、如,考虑一下有多少问题可以用true或flash(可以理解成yes和no)来回答。执行变量值之间的比较或检查输入的有效性就是后面使用布尔变量的两个编程示例。做一下下面这个例子,声明和使用它们。当然还包括赋值,再输出这些值。usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceConsoleApplication2classProgramstaticvoidMain(stringargs)intmyInteger;stringmyString;myInteger=17;myString=myStringis:;
23、Console.WriteLine(01.,myString,myInteger);Console.ReadKey(); 我们完成了3个任务:1、声明两个变量2、给这两个变量赋值3、将这两个变量的值输出到控制台上变量和表达式-变量的声明和赋值 声明一个变量,例如:int age;然后用=赋值运算符给变量赋值:age= 21;变量在使用前,必须初始化。上面的赋值语句可以当做初始化语句。这里还可以做两件事,用户可以在C#代码中看到。第一是同时声明多个类型相同的变量,方法是:在类型的后面用逗号分隔变量名,如下所示:int xSize ySize;其中xSize和ySize都声明为整数类型。第二个技巧
24、是在声明变量的同时赋值,即把两行代码合并在一起:int age = 21; int xSize = 4,ySize = 5;xSize和ySize被赋予不同的值。注意下面的代码:int xSize,ySize = 5;其结果是ySize被初始化,而xSize仅进行了声明,而不是它们都等于5。表达式-数学运算符 介绍完声明和初始化变量,下面该处理它们了。C#包含许多进行这类处理的运算符,包括前面使用过的=赋值运算符,把变量和字面值与运算符符合起来,就可以创建表达式,它是计算的基本建立块。运算符的范围有简单的,也有非常复杂的。其中一些可能只在数学应用程序中使用。简单的操作包括所有的基本计算操作,而
25、复杂的操作则包括通过变量里的内容的二进制表示来处理它们。还有专门用于处理布尔值的逻辑运算符。运算符大致分为3类。一元运算符,处理一个操作数二元运算符,处理两个操作数三元运算符,处理三个操作数大多数运算符都是二元运算符,只有几个一元运算符和一个三元运算符,即条件运算符(条件运算符返回布尔值)。数学运算符只包括一元运算符和二元运算符,共有5个,其中2个有二元和一元两种形式。+(二元):表示两数相加。-(二元):表示两数相减。*(二元):表示两数相乘。/(二元):表示两数相除。%(二元):表示两数相除的余数(求模) +(一元):表示变量1的值等于变量2的值-(一元):表示变量1的值等于变量2的值除/
26、乘以-1+(一元)运算符有点奇怪,因为它对结果没有影响。它不会把值改成正的;如果变量2是-1,则+变量2仍是-1。但这是一个普遍认可的运算符,所以也把它包含进来。最常用的是你可以定制它的操作,在运算符的重载时会介绍它。上面都是简单的数值类型,因为使用其他简单类型,结果可能不太清晰。如果把两个布尔值加在一起会得到什么结果?此时,如果对bool变量使用+或其他数学运算符,编译器就会报错。char变量的相加也会让人搞不懂。记住,char变量实际上存储的就是数字,所以把两个char变量加在一起也会得到int类型的数字。这是一个隐式转换的例子,稍后会介绍这些,因为它也可以用到三个变量混合类型的情况。二元运算符+在用于字符串类型变量时也是有意义的,表示两个字符串的连接值,但其他数学运算符不能用于字符串的处理。这里介绍另外两个运算符是递增和递减运算符。它们都是一元运算符,可以以两种方式使用:放在操作数前面或后面。+:var1的值是var2+1,var2递增1(var1=+var2)-:var1的值是var2-1,var2递减1(var1=-var2
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1