通过这一节课,可以使听众对.NET基本概况和C#开发语言基本结构和语法有一个概括性的认识。操作系统公共语言运行时(CLR)VC++.NetC#VB.NetF#….NetFramework类库(FCL)•CLR是CommonLanguageRuntime的简写,中文翻译是公共语言运行。全权负责托管代码的执行(主要有内存管理和垃圾收集),是.NET的基石。•CLR两个基础核心:•元数据:依赖元数据进行内存管理和垃圾收集等等•MSIL中间语言:使得.NET具有跨语言的集成的能力。CLR所支持的语言都由相对应的编译器编译为MSIL指令。再由CLR中的JIT组件编译MSIL为机器语言,最后由CLR托管执行。编译过程JIT编译•C#是一种简洁、现代、面向对象且类型安全的编程语言。•C#特性:•垃圾回收(Garbagecollection)将自动回收不再使用的对象所占用的内存•异常处理(exceptionhandling)提供了结构化和可扩展的错误检测和恢复方法•类型安全(type-safe)的语言设计则避免了读取未初始化的变量、数组索引超出边界或执行未经检查的类型强制转换等情形•C#是面向对象的语言,然而C#进一步提供了对面向组件编程的支持。•注释就是写在源代码中的描述信息,用来帮助开发人员阅读源代码的。•注释信息会在编译过程中自动过滤掉,不会出现在程序集中。•C#支持三种注释格式:•单行注释:以“//”开始,此行后续任何文本都作为注释内容。•多行注释:以“/*”开始,“*/”结束。可跨越多行。•XML注释:以“///”开始,后面紧跟XML样式元素,用来描述类型•方法,属性,事件,索引器等等信息,VisualStudio中智能提示的描述信•息依赖此注释,也可在编译时期导出这些XML格式的注释到一个XML文档classProgram{///summary///Main方法////summary///paramname=args命令行参数/paramstaticvoidMain(string[]args){/*声明并初始化一个变量**/stringinfo=helloworld;//打印helloworldSystem.Console.WriteLine(info);}}XML格式注释多行注释/*注释内容*/单行注释//注释内容声明HelloWorld类程序入口点,Main的返回类型为void控制台类的WriteLine()方法用于显示输出结果导入System命名空间声明命名空间Notepad将文件保存为HelloWorld.cs命名空间:C#程序是利用命名空间组织起来的。一种“逻辑文件夹”的概念。开发人员可以定义自己的命名空间。常用的命名空间如下:命名空间说明System一些基本数据类型System.Data处理数据存取和管理,在定义ADO.NET技术中扮演重要角色System.IO管理对文件和流的同步和异步访问System.Windows处理基于窗体的窗口的创建System.Reflection包含从程序集读取元数据的类System.Threading包含用于多线程编程的类System.Collections包含定义各种对象集的接口和类•标识符是指标识某一个东西的一个名字符号•比如:变量名,类型名,参数名等等。•标识符以字母或者下划线(_)开头,其余部分允许出现数字和Unicode转义序列。关键字在以@为前缀的情况下也可以作为标识符。•C#严格区分字母大小写。•如Age和age是不同的标识符。示例是否有效说明123否不能以数字开头n123是字母开头,混合数字N123是大些字母N,所以和n123是不同的标识符_n123是下划线加字符和数字int否int是关键字@int是@做前缀加关键字n\u0061me是支持Unicode转义序列•关键字是一组特殊的“标识符”,由系统定义,供开发者使用。因而我们不能再次定义关键字为标识符(以@字符开头时除外)。•比较常用的有using、class、static、public、get*、set*、var*等等。•其中加“*”的比较特殊些,称作上下文关键字,这些关键字只有在•特殊的位置才会有意义。如get和set只有在属性中才有意义、var只能用在局部变量环境下。声明一个变量的语法:数据类型变量名;//变量名须为有效标识符如:stringname;声明并初始化一个变量:数据类型变量名=初始化值;如:stringname=“张三”;运算符类型常用运算符示例算数运算符+-*/%inti=1,j=2;i+j;//结果3关系运算符====!=ij;//结果false赋值运算符=+=-=*=/=%=i+=j;//结果3[i=i+j;的简写形式]自运算符前置:++--后置:++--intn=1;intm;前置:m=++n;//结果m=2,n=2后置:m=n++;//结果m=1,n=2成员访问运算符.[].:调用对象成员[]:访问数组元素或索引器逻辑运算符!&&||boola=true;!a;//结果false常用的运算符:•大多数运算符都可以重载(overload)。运算符重载允许指定用户定义的运算符实现来执行运算,这些运算的操作数中至少有一个,甚至所有操作数都属于用户定义的类类型或结构类型。•运算符是有优先级的,优先级高的先运算。•表达式由操作元(operand)和运算符(operator)构成。•运算元可以是常数、对象、变量、常量、字段等等。•运算符可以是上节提到的一些运算符。•当表达式包含多个运算符时,运算符的优先级(precedence)控制各运算符的计算顺序。•例如,表达式x+y*z按x+(y*z)计算。演示•变量(variable),言外之意即是可变的,用来存储程序所需的数据。•声明一个变量的语法结构如下://变量名必须是有效的标识符数据类型变量名;•也可以在声明的同时初始化该变量://变量名必须是有效的标识符//值必须是与变量声明的数据类型兼容。数据类型变量名=值;classProgram{staticvoidMain(string[]args){//声明变量intage;//为变量age赋值age=18;//声明name并初始化为李四stringname=李四;}}•常量:一经初始化就不会再次被改变的“变量”,在程序的整个运行过程中不允许改变它的值。•编译时常量:•const数据类型常量名=值;•编译时常量做为类成员时总是作为static成员出现。不允许自己加static关键字。•编译时常量的值必须是在编译时期能确定下来的,只支持一些基本数据类型。•运行时常量:•readonly数据类型常量名=值;•运行时常量可以弥补编译时常量不能定义复杂数据类型的缺点。classProgram{//正确,string为基本数类型conststringNAME_CONST=conststring;//错误,Program为自定义复杂类型constProgramPROGRAM_CONST=newProgram();//正确,readonlystringNAME_READONLY=readonlystring;//正确,可定义任意数据类型readonlyProgramPROGRAM_READONLY=newProgram();}•结构(struct)是能够包含数据成员和函数成员的数据结构。•结构类型的变量直接存储该结构的数据。•所有结构类型都隐式地从类型System.ValueType继承。•System.ValueType继承自System.Object。•结构是值类型,不需要在堆分配。•结构类型不允许继承。//用struct修饰,表示一个结构类型structPoint{publicintx;publicinty;publicPoint(intx,inty){this.x=x;this.y=y;}}•枚举(enum)是具有一组命名常量的独特的值(结构)类型•每个枚举类型都有一个相应的整型类型,称为该枚举类型的基础类型(underlyingtype)。没有显式声明基础类型的枚举类型所对应的基础类型是int。枚举类型的存储格式和取值范围由其基础类型确定。•所有枚举类型默认继承自System.Enum类型,System.Enum继承自System.ValueType。故枚举为结构类型。//:long表括示基础类型是long//如果不写则默认为intenumAlignment:long{//=也可不写,默认则是以0开始,依次加1Left=-1,Center=0,Right=1}publicclassTest{staticvoidMain(){//初始化一个枚举变量Alignmentalignment=Alignment.Left;//输出:LeftConsole.WriteLine(alignment);//输出:-1Console.WriteLine((long)alignment);//获得基础类型TypeunderlyingType=Enum.GetUnderlyingType(typeof(Alignment));//输出:System.Int64//解释:[long关键字映射的类型为System.Int64]Console.WriteLine(underlyingType.FullName);}}•数组(array)是一种包含若干变量的数据结构,这些变量都可以通过计算索引进行访问。数组中包含的变量(元素(element))具有相同的类型,该类型称为数组的元素类型(elementtype)。•数组类型为引用类型,因此数组变量的声明只是为数组实例的引用留出空间。在运行时使用new运算符动态创建(须指定长度),长度在该实例的生存期内是固定不变的。数组元素的索引范围从0到Length-1。new运算符自动将数组的元素初始化为它们的默认值,例如将所有数值类型初始化为零,将所有引用类型初始化为null。•C#支持一维、多维、交错数组。•数组下标一般是从0开始。也提供有其他方式支持非从0下标开始的数组。•System.Array类型是所有数组类型的抽象基类型。•访问数组元素使用下标方式:array[索引]publicclassTest{staticvoidMain(){//元素个数为3的int类型数组int[]ages=newint[3];//3X3的多维数组int[,]i=newint[3,3];//交错数组int[][]j=newint[2][];j[0]=newint[2]{3,4};j[1]=newint[3];//输出:4Console.WriteLine(j[0][1]);}}•写程序中很大一部分的时间都是在和字符串打交道。微软给出的.NET类库中也给出了一些字符串处理的类型。•C#中的常用字符串处理类:•System.String•System.Text.StringBuilder•利用String类可以进行字符串的创建,截取,替换,合并等等操作。也可以用“+”方便的进行字符串的合并。•大写String与小写string是完全相同的,大写是指.NET类库中的String类型,小写是C#关键字,也是对应到String这个类型上去的。比如在C#中int和Int32也是这样对应的。•String的特别之处:•不变性;•读共享,写复制;•字符串驻留技术;•String是引用类型,但其值确是不可变的,即是指已经赋值就不能再改变。针对字符串的一些操作(如合并、截取)都会产生出新的String对象。•由于写复制的特性,在一些需要大量合并字符串的场合就会产生出很多临时性的String对象,然后又被丢弃,浪费掉不少内存。所以类库中有另一个System.Text.StringBuilder类型来高效的拼接字符串。publicclassTest{staticvoidMain(){Stringname=[小明;//合并字符串name=name+20岁;name=name+男生];Console.Writ