第2章C# 30程序设计基础(ASPNET 35开发大全 共29章).pdf
第 2 章 C#3.0 程序设计基础 在第一章里,了解了 ASP.NET 3.5 的特性和一些基本的.NET Framework 知识,不过如果要深入到ASP.NET 3.5 应用程序开发,需要对开发语言有更加深入的了解。而在.NET 平台上,微软主推的编程语言就是 C#,本章将会从 C#的语法、结构和特性来讲解,以便读者能够深入的了解 C#程序设计。2.1 C#程序 C#程序有自己的程序结构。C#编程语言类似 C+/Java 等面向对象编程语言,同样需要编写类、创建对象等。但是 C#依旧有与其他面向对象编程语言不同的特性,使用这些特性能够快速的正确的编写C#宿主语言的应用程序,如 ASP.NET、WinForm 等。2.1.1 C#程序的结构 在开始学习和编写 C#代码之前,首先应该了解 C#编程语言的结构,下列代码说明了 C#应用程序的基本结构。using System;using System.Collections.Generic;using System.Linq;using System.Text;/使用命名空间 namespace mycsharp /程序代码命名空间 class Program /应用程序主类 static void Main(string args)/入口方法 Console.WriteLine(Hello World);/输出 Hello World Console.ReadKey();/等待用户输入 其中,using 关键字的用途是引用微软的.NET 框架中现有的类库资源,该关键字出现在应用程序代码的开头,并使用在 cs 为后缀的文件中使用。using 关键字通常情况下会出现几次,其目的是引用类库中的各种资源,这些资源不仅包括代码中的 System,System.Collections.Generic,Linq,还包括其他.NET 框架的资源。System 命名空间提供了构建应用程序所需的各种系统功能,例如 LINQ 的类库包括了构建 LINQ 应用程序的各种类库资源。.NET 中提供大量的命名空间,以便开发人员能够使用现有的类库进行应用程序的开发。同时,在代码中也可以看到在其中包含一个 mycsharp 的一个命名空间,示例代码如 namespace mycsharp。在当前程序中声明该命名空间,可以在其他的程序中引用这个命名空间,并使用此命名空间下的类和方法。21 另外,Program 是一个类名。在 C#或其他的任何面向对象语言中(如 JAVA、C+)都需要编写类,类用于创建对象。在上述代码中,Program 是一个类的名称。方法是用于描述类的行为。在上述示例第 9 行中,static void Main 是一个全局静态方法,它指示编译器从此处开始执行程序,相当于程序的入口,程序运行的时候会执行 Main 方法作为入口。在 C#Windows 编程中,大部分的应用程序必须在其组成程序的其中一个类中包含 Main 方法。语句就是在 C#应用程序中包含的指令,通过使用分号进行分割,编译器通过分号来区分它们。一些编程语言只允许一行放置一条语句,但是 C#允许放置多个语句,也可以将一个语句拆分成多行。虽然 C#编译器支持这样的特性,但是还是推荐使用一行放置一个语句的,这样不仅提高了可读性,也便于书写。括号“”和“”用来标识程序中代码的范围,如上述代码中 Main 方法囊括了 Main 方法的语句,Program 类囊括了类的方法,而 namespace mycsharp 命名空间囊括了此命名空间里的所有类。值得注意的是,Visual Studio 2008 为开发人员在编写程序的时候提供了诸多的智能提示,在完成一个类或一个变量时,系统会自动补全,而当鼠标放到一个大括号上的时候,编译器会指示开发人员此括号的范围,如图 2-1 所示。图 2-1 外围元素被标记 注意:在一个类内的所有方法都是独立的方法,所以每个大括号后面都不需要分号,同样对于命名空间里的所有类也是一样。2.1.2 C#IDE 的代码设置 代码格式也是程序设计中一个非常重要的组成环节,他可以帮助用户组织代码和改进代码,也让代码具有可读性。具有良好可读性的代码能够让更多的开发人员更加轻松的了解和认知代码。按照约定的格式书写代码是一个非常良好的习惯,下面的代码示例说明了应用缩进、大小写敏感、空白区和注释等格式的原则。using System;using System.Collections.Generic;using System.Linq;/使用 LINQ 命名空间 using System.Text;namespace mycsharp /声明命名空间 class Program /主程序类 22 static void Main(string args)/静态方法 Console.WriteLine(Hello World);/这里输出 Hello World Console.WriteLine(按任意键退出.);Console.ReadKey();/这里让用户按键后退出,保持等待状态 1缩进缩进 缩进可以帮助开发人员阅读代码,同样能够给开发人员带来层次感。读者可以从以上代码看出这一串代码让人能够很好的分辨区域,非常方便的就能找到 Main 方法的代码区域,这是因为括号都是有层次的。缩进让代码保持优雅,同一语句块中的语句应该缩进到同一层次,这是一个非常重要的约定,因为它直接影响到代码的可读性。虽然缩进不是必须的,同样也没有编译器强制,但是为了在不同人员的开发中能够进行良好的协调,这是一个值得去遵守的约定。2大小写敏感大小写敏感 C#是一种对大小写敏感的编程语言。可能 php 等其他语言的开发人员不太适应大小写敏感,但是在C#中,其语法规则的确是对字符串中字母的大小写敏感的,例如“C Sharp”、“c Sharp”、“c sHaRp”都是不同的字符串,在编程中应当注意。3空白空白 C#编译器会忽略到空白。使用空白能够改善代码的格式,提高代码的可读性。但是值得注意的是,编译器不对引号内的任何空白做忽略,在引号内的空格作为字符串存在。4注释注释 在 C/C+里,编译器支持开发人员编写注释,以便开发人员能够方便的阅读代码。当然,在 C#里也一样继承了这个良好的习惯。之所以这里说的是习惯,是因为编写注释同缩进一样,没有人强迫要编写注释,但是良好的注释习惯能够让代码更加优雅和可读,谁也不希望自己的代码在某一天过后自己也不认识了。注释的写法是以符号“/*”开始,并以符号“*/”结束,这样能够让开发人员更加轻松的了解代码的作用,同时,也可以使用符号“/”双斜线来写注释,但是这样的注释是单行的,示例代码如下所示。/*多行注释 *本例演示了在程序中写注释的方法 在注释内也可以不要开头的*号 */单行注释,一般对单个语句进行注释 5布局风格布局风格 class Program static void Main(string args)Console.WriteLine(Hello World);/这里输出 Hello World Console.WriteLine(按任意键退出.);Console.ReadKey();/这里让用户按键后退出,保持等待状态 23 从以上代码可以看出,程序中使用了缩进、大小写敏感,空白区和注释等,但是这个代码风格依旧不是最好,可以修改代码让代码更加“好看”。这里能够将代码进行修正,修正后的示例代码如下所示。class Program static void Main(string args)Console.WriteLine(Hello World);/这里输出 Hello World Console.WriteLine(按任意键退出.);Console.ReadKey();/这里让用户按键后退出,保持等待状态 这种布局风格让开发人员感觉到耳目一新,这样更能方便更多的开发人员阅读源代码。如果打开一千行或更多代码量的源文件时,其编码格式都是标准的风格的话,不管是谁再接手去阅读,都能尽快上手。不仅如此,在软件开发当中,应该规定好每个人都使用同样的布局风格,让团队能够协调运作。2.2 变量 在任何编程语言中,无论是传统的面向过程还是面向对象都必须使用变量。因此,变量都有自己的数据类型,在使用变量的时候,必须使用相同的数据类型进行运算。在程序的运行中,计算中临时存储的数据都必须用到变量,变量的值也会放置在内存当中,由计算机运算后再保存到变量中,由此可见,变量在任何的应用程序开发中都是非常基础也是非常重要的。同样,在 C#中也需要变量对数据进行存储,本节将会介绍 C#的基本语法、数据类型、变量、枚举等。2.2.1 定义 要声明一个变量就需要为这个变量找到一个数据类型,在 C#中,数据类型由.NET Framework 和 C#语言来决定,表 2-1 列举了一些预定义的数据类型。表 2-1 预定义数据类型 预定义类型 定义 字节数 byte 0255之间的整数 1 sbyte-128127之间的整数 1 short-3276832767之间的整数 2 ushort 065535之间的整数 2 int-21474836482147483647之间的整数 4 uint 04294967259之间的整数 4 long-92233720368547758089223372036854775807之间的整数 8 ulong 018445744073709551615之间的整数 8 bool 布尔值,true of false 1 float 单精度浮点值 4 double 双精度浮点值 8 decimal 精确的十进制值,有28个有效单位 12 object 其他所有类型的基类 N/A char 065535之间的单个Unicode字符 2 string 任意长度的Unicode字符序列 N/A 24 一个简单的声明变量的代码如下所示:int s;/声明整型变量 float myfloat;/声明浮点型变量 上述代码声明了一个整型的变量 s,同时也声明了一个单精度浮点型变量 myfloat。2.2.2 值类型 这种类型的对象总是直接通过其值使用,不需要对它进行引用。基于值类型的变量直接包含值。并且,所有的 C#局部变量都需要初始化后才可以使用,值类型同样如此,初始化代码如下所示。int s;/声明整型变量 s=new int();/声明整型变量 s=3;/初始化变量 上式等同于如下代码。int s;/声明整型变量 s=3;/初始化变量 所有的值类型均隐式的派生自 System.ValueType,并且值类型不能派生出新的类。值的类型不能为null,但是可空类型允许将 null 值赋给值类型,在上面的代码中,程序通过默认的构造函数给为变量 s初始化并赋值。2.2.3 引用类型 引用类型的变量又称为对象,是可存储对实际数据的引用。常见的引用类型有 class、interface、delegate、object 和 string。多个引用变量可以附加于一个对象,而且某些引用可以不附加于任何对象,如果声明了一个引用类型的变量却不给他赋给任何对象,那么它的默认值就是 null。相比之下,值类型的值不能为 null。2.3 变量规则 声明变量并不是随意声明的,变量的声明有自己的规则。在 C#中,应用程序包含许多关键字,包括 int 等是不能够声明为变量名的,如 int int 是不允许的,在进行变量的声明和定义时,需要注意变量名称是否与现有的关键字重名。2.3.1 命名规则和命名习惯 命名规则就是给变量取名的一种规则,一般来说,命名规则就是为了让开发人员给变量或者命名空间取个好名,不仅要好记,还要说明一些特性。在 C#里面,有常用的一些命名的习惯如下。Pascal 大小写形式:所有单词的第一个字母大写,其他字母小写。Camel 大小写形式:除了第一个单词,所有单词的第一个字母大写,其他字母小写。当然,在其他编程中,不同的开发人员可能遇到了一些不一样的命名规则和命名习惯,但是在 C#中,推荐使用常用的一些命名习惯,这样能保证代码的优雅性和可读性。同时,也应该避免使用相同名称的命名空间或与系统命名相同的变量,如以下代码所示:string int;/系统会提示出错 25 运行上述代码时系统会提示错误,因为字符串“int”是一个关键字,当使用关键字做变量名时,编译器会混淆该变量是变量还是关键字,所以系统会提示错误。所以,在变量声明时应该避免变量名称与关键字重名,如果变量名称与关键字重名,编译器就会报错,C#中常用的关键字如表 2-2 所示:表 2-2 不应使用的关键字名称 AddHandler AddressOf Alias And Ansi As Assembly Auto BitAnd BitNot BitOr BitXor Boolean ByRef Byte ByVal Call Case Catch CBool CByte CChar CDate CDec CDbl Char CInt Class CLng CObj Const CShort CSng CStr CType Date Decimal Declare Default Delegate Dim Do Double Each Else ElseIf End Enum Erase Error Event Exit ExternalSource False Finally For Friend Function Get GetType Goto Handles If Implements Imports In Inherits Integer Interface Is Let Lib Like Long Loop Me Mod Module MustInherit MustOverride MyClass Namespace MyBase New Next Not Nothing NotInheritable NotOverridable Object On Option Optional Or Overloads Overridable Overrides ParamArray Preserve Private Property Protected Public RaiseEvent ReadOnly ReDim Region REM RemoveHandler Resume Return Select Set Shadows Shared Short Single Static Step Stop String Structure Sub SyncLock Then Throw To True Try TypeOf Unicode Until Variant When While With WithEvents WriteOnly Xor eval extends instanceof package var 注意:标识符、参数名、函数名都不需要使用缩写。如果要使用缩写,超过两个字符以上的缩写都应该使用 Camel 大写格式。2.3.2 声明并初始化变量 在程序代码编写中,需要大量的使用变量和读取变量的值,所以需要声明一个变量来表示一个值。这个变量可能描述是一个人的年龄,也可能是一辆车的颜色。在声明了一个变量之后,就必须给这个变量一个值,只有在给变量值之后能够说明这个变量被初始化。1语法语法 声明变量的语法非常简单,即在数据类型之后编写变量名,如一个人的年龄(age)和一辆车的颜色(color),声明代码如下所示。int age;/声明一个叫 age 的整型变量,代表年龄 string color;/声明一个叫 color 的字符串变量,代表颜色 上述代码声明了一个整型变量 age 和一个字符串型变量 color,由于年龄的值不会小于 0 也不会大于100,所以在声明时可以使用数字类型进行声明。2初始化变量初始化变量 变量在声明后还需要初始化,例如“我年龄 21 岁,很年轻,我想买一辆红色的车”,那么就需要对相应的变量进行初始化,示例代码如下所示。26 int age;/声明一个叫 age 的整型变量,代表年龄 string color;/声明一个叫 color 的字符串变量,代表颜色 age=21;/声明始化,年龄 21 岁 color=red;/声明始化,车的颜色为红色 上述代码也可以合并为一个步骤简化编程开发,示例代码如下所示。int age=1;/声明并初始化一个叫 age 的整型变量,代表年龄 string color=red;/声明初始化 3赋值赋值 在声明了一个变量之后,就可以给这个变量赋值了,但是当编写以下代码就会出错,示例代码如下。float a=1.1;/错误的声明浮点类型变量 当运行了以上代码后会提示错误信息:不能隐式地将 Double 类型转换为“float”类型;请使用“F”后缀创建此类型。从错误中可以看出,将变量后缀增加一个“F”即可,示例代码如下所示。float a=1.1F;/正确的声明浮点类型变量 运行程序,程序就能够编译并运行了。这是因为若无其他指定,C#编译器将默认所有带小数点的数字都是 Double 类型,如果要声明成其他类型,可以通过后缀来指定数据类型,如表 2-3 将展示一些可用的后缀,并且后缀可用小写。表 2-3 可用的后缀表 后缀 描述 U 无符号 L 长整型 UL 无符号长整型 F 浮点型 D 双精度浮点型 M 十进制 L 长整型 4转义字符转义字符 在开发过程当中,如果需要将单引号或者双引号输出,或将单引号等字符作为字符串输出,就会发现在字符串中单引号或者双引号等字符是不能直接进行输出呈现。为了解决这一问题,于是引入了转义字符,常用的转义字符表如表 2-4 所示。表 2-4 转义字符表 换码序列 字符名称 单引号”双引号 反斜杠 0 空字符 a 警报符 b 退格 f 换页 n 换行 r 回车 t 水平制表符 v 垂直制表符 若在应用程序开发过程中,需要在程序里的字符串中编写一个双引号并进行输出,可以使用转义字符进行输出,示例代码如下所示。string str=”this is”;/使用转义字符 27 6设置断点设置断点 在 Visual Studio.NET 开发环境中,为用户提供了在开发应用程序时查看变量值的工具,只需要在查看的变量上设置断点,以调试模式运行应用程序,就可以在调试窗口中查看变量的值。在代码编辑窗口单机左边的空白处可直接设置断点。断点以红色圆点标识。也可以在调试菜单中单击【切换断点】按钮,或使用快捷键【F9】键来设置断点,如图 2-2 所示。图 2-2 设置断点 按下【F5】键或在菜单栏中的调试菜单中单击【启动调试】按钮都可以运行程序。当程序开始运行,程序从 Main 入口运行并直至遇到断点,遇到断点后程序将停止运行,如图 2-3 所示。同时开发环境会高亮显示下一条即将执行的代码,同时调试查看窗口会显示,并呈现变量的当前值,如图 2-4 所示,。图 2-3 运行到断点,提示下一步执行的代码 图 2-4 显示当前值 在调试完成后,可以通过快捷键【Shift+F5】停止调试,也可以在菜单栏中的【调试】菜单里的【停止调试】选项中停止应用程序的调试。如果需要继续执行,可以按下【F5】键或在调试菜单中选择【继续执行到下一个断点】选项进行执行。开发人员还可以通过使用快捷键【F10】,或在调试菜单中选择【逐过程】或【逐语句】每次只执行一条语句,方便对代码中变量变化的查看。2.3.3 数组 数组是一个引用类型,开发人员能够声明数组并初始化数据进行相应的数组操作,数组是一种常用的数据存放方式。1数组的数组的声明声明 数组的声明方法是在数据类型和变量名之间插入一组方括号,声明格式如下所示。string groups;/声明数组 以上语句声明了一个变量名为 groups 的数组,其数据类型为 string。声明了一个数组之后,并没有为此数组添加内容初始化,需要对数组初始化,才能使用数组。28 2数组的数组的初始化初始化 开发人员可以对数组进行显式的初始化,以便能够填充数组中的数据,初始化代码如下所示。string groups=,c#,control,mvc,wcf,wpf,linq;/初始化数组 值得注意的是,与平常的逻辑不同的是,数组的开始并不是 1,而是 0。以上初始化了 groups 数组,所以 groups0的值应该是“”而不是“c#”,相比之下,group1的值才应该是“c#”。3.NET中数组的常用的属性和方法中数组的常用的属性和方法 在.NET 中,.NET 框架为开发人员提供了方便的方法来对数组进行运算,专注于逻辑处理的开发人员不需要手动实现对数组的操作。这些常用的方法如下所示。Length 方法用来获取数组中元素的个数。Reverse 方法用来反转数组中的元素,可以针对整个数组,或数组的一部分进行操作。Clone 方法用来复制一个数组。对于数组的操作,可以使用相应的方法进行数据的遍历、查询和反转,示例代码如下所示。using System;using System.Collections.Generic;using System.Linq;using System.Text;/声明文本命名空间 namespace myArray /主应用程序类 class Program static void Main(string args)string groups=,c#,control,mvc,wcf,wpf,linq;/初始化一个数组 int count=groups.Length;/获取数组的长度 Console.WriteLine(-数组长度-);Console.WriteLine(count.ToString();/输出数组的长度 Console.WriteLine(-原数组元素值-);for(int i=0;i 0)/使用 Compare 比较字符串 Console.WriteLine(字符不串相等);/输出不相等信息 else Console.WriteLine(字符串相等);/输出相等信息 编译上述代码并运行,其结果如图 2-12 所示。图 2-12 比较字符串 在上述代码运行后,如果字符串不相等,则输出“字符串不相等”字符,否则会输出“字符串相等”。2连接字符串连接字符串 当一个字符串被创建,对字符串的操作的方法实际上是对字符串对象的操作。其返回的也是新的字符串对象,与 int 等数据类型一样,字符串也可以使用符号“+”进行连接,代码如下所示。string str=Guojing is A C#;/声明字符串 32 string str2=Programmer;/声明字符串 Console.WriteLine(str+str2);/连接字符串 在上述例子中,声明并初始化两个字符串型变量 str 和 str2,并输出 str+str2 的结果,运行结果如图2-13 所示。图 2-13 字符串连接 同样的,str 和 str2 也可以为新的字符串赋值,代码如下所示。string mystr=str+str2;/连接字符串 Console.WriteLine(mystr);/输出字符串 上述代码运行结果同样如图 2-13 所示,这里就不再运行演示。注意:在上述代码中,mystr 被初始化 str 和 str2 的“和”,但是在运算过程当中,str 和 str2 的值都没有被改变。3拆分字符串拆分字符串 能够连接一个字符串,同样也可以拆分一个字符串。.NET Framework 提供了若干方法供拆分字符串,示例代码如下所示。string str=Guojing is A C#Programmer;/声明字符串 Console.WriteLine(str.IndexOf(is).ToString();/拆分字符串 Console.ReadKey();编译运行后,可以看到返回的结果是 8,说明 is 是字符串从开始第 8 位才找到 is,若搜索不到查询的字符串,则返回-1。当字符串拆分成子字符串之后,可以通过 Split 方法对字符串进行分割,代码如下所示。string str=BeiJing,Shanghai,GuangZhou,WuHan,ShenYang;/初始化字符串 string p=str.Split(,);/使用 Split 方法分割并存入数组 for(int i=0;i p.Length;i+)/遍历显示 Console.WriteLine(pi);/输出字符串 上述代码第一句声明并初始化了一个字符串,第二句使用 Split 函数按照逗号来分割字符串,并存入到数组 p 内,然后遍历显示数组元素。注意:使用 Split 函数的时候,通常情况下只能使用字符对字符串进行分割,所以使用的是单引号。4更改字符串大小写更改字符串大小写 在.NET中,系统为开发人员提供了将字符串更改为大写或小写的方法,这两个方法分别为ToUpper()和 ToLower()。使用该方法能够进行字符串的大小写转换,示例代码如下所示。string str=BeiJing,Shanghai,GuangZhou,WuHan,ShenYang;/声明字符串 Console.WriteLine(str.ToUpper();/转换成大写 Console.WriteLine(str.ToLower();/转换成小写 Console.ReadKey();/等待用户输入 5常用的字符串操作常用的字符串操作 33 在 C#软件开发过程,字符串是使用率最高的数据类型之一,开发人员往往需要对字符串进行大量的操作。这里介绍一些经常使用的字符串操作如判断字符串是否为空,替换字符串中相应的字符等等。判断字符串是否为空会经常在程序中使用,以保证用户输入的完整性,示例代码如下所示。string str=BeiJing,Shanghai,GuangZhou,WuHan,ShenYang;/声明字符串 if(String.IsNullOrEmpty(str)/使用 String 类的静态方法 Console.WriteLine(字符串为空);/输出字符串为空的信息 else Console.WriteLine(字符串不为空);/输出字符串不为空的信息 当需要对字符串执行替换操作时,可以使用 Replace 方法进行字符串的替换,示例代码如下所示。string str=BeiJing,Shanghai,GuangZhou,WuHan,ShenYang;/声明字符串 str=str.Replace(ShenYang,ShanXi);/使用 Replace 方法 Console.WriteLine(str);/输出字符串 大多数应用程序都是对字符串进行操作,这里简单的介绍几种常用的字符串的操作,熟练掌握字符串的操作对应用程序开发有很大的好处。2.3.6 创建和使用常量 常量是一般在程序开发当中不经常更改的变量,如 值、税率或者是数组的长度等。使用常量一般能够让代码更具可读性、更加健壮、便于维护。在程序开发当中,好的常量使用技巧对程序开发和维护都有好的影响,示例代码如下所示。const double pi=3.1415926;/常量 pi,static void Main(string args)/程序入口方法 double r=2;/声明 double 类型常量 double round=2*pi*r*r;/使用常量 Console.WriteLine(round.ToString();/输出变量值 Console.ReadKey();/等待用户输入 上述代码非常简单,就是计算一个圆的圆周率。当代码非常长的时候,程序也会非常干练,容易阅读,如果在程序中出现了以下代码,也能够理解该表达式的作用。示例代码如以下所示。double Perimeter=2*pi*r;/使用常量 就算是其他的开发人员阅读到上述代码,也能够轻易的了解该语句的作用就是求圆的周长,因为在前面定义了常量 pi=3.1415926;当程序中用到这个变量的时候,立刻就能够知道程序的作用。声明变量的方法,只需要在普通的变量格式前加上 const 关键字即可,声明代码如下所示。const double pi=3.1415926;/声明 const 变量 const int max=500;/声明 const 变量 const long kilometer=1000;/声明 const 变量 使用 const 声明的变量能够在程序中使用,但是值得注意的是,使用const 声明的变量不能够在后面的代码中对该变量进行重新赋值。注意:使用 const 声明的变量如果在后面的代码中进行重新赋值或更改,则编译器会提示错误。const修饰符通常用于不常更改的变量的修饰。34 2.3.7 创建并使用枚举 枚举类型是一组已命名的常量,它是一种用户自定义类型,开发人员可以自行创建枚举类型,声明枚举变量并初始化。枚举变量和普通的变量相比,确保了只将预定的值赋予变量,让代码更加容易维护。在编写代码的时候,允许以简单容易辨认的名字作为变量名,使代码更具有可读性。同时,如果开发人员声明枚举变量,Visual Studio 2008 还能够提供的智能感知功能够让代码更加方便的输入。1声明及初始化枚举声明及初始化枚举 如果需要创建枚举类型,就需要使用 enum 关键字,指定一个类型名称,如 int 等,然后列举出枚举可以使用的值,示例代码如下所示。enum color red,yellow,green,blue;/声明枚举 上述代码创建了一个 color 类型,然后声明了这个类型的变量,并使用枚举成员赋值,示例代码如下所示。class Program enum color red,yellow,green,blue;/声明枚举 static void Main(string args)/主程序入口方法 Console.WriteLine(color.green);/查看枚举成员变量 green Console.ReadKey();/等待用户按键 编译并运行上述代码,其输出结果为 green,说明在程序中已经对枚举变量中的成员初始化了。2使用枚举类型使用枚举类型 枚举是用户自定义类型,所以在程序中可以引用用户的自定义类型进行自定义类型的变量的创建,示例代码如下所示。color mycolor=color.green;/使用枚举类型 注意:枚举类型的定义只能在命名空间或类内声明,否则编译器会报错。4枚举成员的赋值和常用类型枚举成员的赋值和常用类型 声明并初始化枚举类型,也可以对枚举成员的值进行初始化,示例代码如下所示。enum color red=1,yellow=2,green=3,blue=1;/枚举成员的赋值 不仅可以为枚举成员初始化,也可以为枚举成员定义基本类型,示例代码如下所示。enum color:int red=1,yellow=2,green=3,blue=1;/定义基本类型 2.3.8 类型转换 在应用程序开发当中,很多的情况都需要对数据类型进行转换,以保证程序的正常运行。类型转换是数据类型和数据类型之间的转换,在.NET 中,存在着大量的类型转换,常见的类型转换代码如下所示。int i=1;/声明整型变量 Console.WriteLine(i);/隐式转换输出 在上述代码中 i 是整型变量而 WriteLine 方法的参数是 Object 类型,但是 WriteLine 方法依旧能够正确输出是因为系统将 i 的类型在输出的时候转换成了字符型。在.NET 框架中,有隐式转换和显式转换,隐式转换是一种由 CLR 自动执行的类型转换,如上述代码中的,就是一种隐式的转换(开发人员不明 35 确指定的转换),该转换由 CLR 自动的将 int 类型转换成了 string 型。在.NET 中,CLR 支持许多数据类型的隐式转换,CLR 支持的类型转换列表如表 2-5 所示。表 2-5 CLR支持的转换列表 从该类型 到该类型 sbyte short,int,long,float,double,decimal byte short,ushort,int,uint,long,ulong,float,double,decimal short int,long,float,double,decimal ushort int,uint,long,ulong,float,double,decimal int long,float,double,decimal uint long,ulong,float,double,decimal long,ulong float,double,decimal float double char ushort,int,uint,long,ulong,float,double,decimal 显式转换是一种明确要求编译器执行的类型转换。在程序开发过程中,虽然很多地方能够使用隐式转换,但是隐式转换有可能存在风险,显式转换能够通过程序捕捉进行错误提示。虽然隐式也会提示错误,但是显式转换能够让开发人员更加清楚的了解代码中存在的风险并自定义错误提示以保证任何风险都能够及早避免,示例代码如下所示。int i=1;/声明整型变量 i float j=(float)i;/显式转换为浮点型 上述代码说明了显式转换的基本语法格式,具体语法格式如下所示。type variable1=(cast-type)variable2;注意:显式的转换可能导致数据的部分丢失,如 3.1415 转换为整型的时候会变成 3。除了隐式的转换和显式的转换,还可以使用.NET 中的 Convert 类来实现转换,即使是两种没有联系的类型也可以实现转换。Convert 类的成员函数都是静态方法,当调用 Convert 类的方法时无需创建Convert 对象,当使用显式的转换的时候,若代码如下所示,则编译器会报错。string i=1;/声明字符串变量 int j=(int)i;/显式转换为整型 Console.WriteLine(j);/隐式转换为字符串 但是明显的是,字符串变量 i 的值是有可能转换成整型变量值 1 的,Convert 类能够实现转换,示例代码如下所示。string i=1;/声明字符串变量 int j=Convert.ToInt32(i);/显式转换为整型 Console.WriteLine(j);/隐式转换为字符串 上述代码编译通过并能正常运行。Convert 类提供了诸多的转换功能,每个 Toxx 方法都将变量的值转换成相应.NET 简单数据类型的值,如 Int16、Int32、String 等。但是值得注意的是,并不是每个变量的值都能随意转换,示例代码如下所示。string i=haha;/声明字符串变量 int j=Convert.ToInt32(i);/错误的转换 上述代码中,i 的值是字符串“haha”,很明显,该字符串是无法转换为整型变量的。运行此代码后系统会抛出异常提示字符串“haha”不能够转换成整型常量。2.4 编写表达式 在了解了 C#中的数据类型、变量的声明和初始化方式、以及类型转换等基本知识,就需要了解如 36 何进行表达式的编写。表达式在 C#应用程序开发中非常的重要,本节将说明如何使用运算符创建和使用表达式。2.4.1 表达式和运算符 表达式和运算符是应用程序开发中最基本也是最重要的一个部分,表达式和运算符组成一个基本语句,语句和语句之间组成函数或变量,这些函数或变量通过某种组合形成类。1定义定义 表达式是运算符和操作符的序列。运算符是个简明的符号,包括实际中的加减乘除,它告诉编译器在语句中实际发生的操作,而操作数既操作执行的对象。运算符和操作数组成完整的表达式。2运算符类型运算符类型 在大部分情况下,对运算符类型的分类都是根据运算符所使用的操作数的个数来分类的,一般可以分为三类,这三类分别如下所示。一元运算符:只