1、Web Service 编程 -C#.NET,老师:I94Self E_mail: QQ:200762716,第二章 C#基本语法,编译C#语言 :请参见P32-39,P33表2-1,第二章 C#基本语法,数据类型介绍 : 值类型: 值类型存储一个实际的值。 引用类型:引用类型存储一个对象(对象是一个类的实例)的地址。 指针类型:指针类型是用来操作内存的,这是一种不安全的方式。实际上,指针就是一种特殊的引用类型。,第二章 C#基本语法,C#中的内置数据类型(简单类型): 整型 C#类型 .NET类型 所占字节数 值范围sbyte SByte 1 -128127(有符号)byte Byte 1
2、0255(无符号)short Int16 2 -32,76832,768(有符号)ushort UInt16 2 065,535(无符号)int Int32 4 -2,147,483,6472,147,483,647(有符号)uint UInt32 4 04,294,967,295(无符号)long Int64 8 -9,223,372,036,854,775,8089,223,372,036,854,775,807(有符号)ulong UInt64 8 18,446,744,073,709,551,615(无符号),第二章 C#基本语法,、浮点类型 C#类型 .NET类型 所占字节数 取值范
3、围float Single 4 近似1.510-45近似3.41038,有七位有效数字。实现IEEE 754标准double Double 8 近似510-324近似1.710308,15到16位有效数字。实现IEEE 754标准 decimal Decimal 12 1.010-28近似 7.91028,28位有效数字,第二章 C#基本语法,字符型 C#类型 .NET类型 所占字节数 值范围char Char 2 16位Unicode字符 转义字符 转义字符 描述 转义字符 描述 单引号 f 换页” 双引号 n 换行 反斜线 r 回车0 空 t 水平taba 报警 v 垂直tabb 空格,第
4、二章 C#基本语法,结构类型结构是用户自定义的数据类型。结构类型是指把各种不同类型数据信息组合在一起形成的组合类型。,1、结构的声明结构类型也是先声明后使用。声明结构类型时要使用struct关键字,声明结构类型的一般语法格式如下:struct 标识符/结构成员定义,例:定义一个表示矩形的结构。 struct Rectangle /定义名为Rectangle的结构 public double 长; public double 宽;public代表这个成员是公有成员,可以被外界访问。,结构体中也可以放方法成员,如可以在结构体中计算面积。例: struct Rectangle /定义名为Studen
5、t的结构 public double 长; public double 宽;public void 面积( )Console.WriteLine(“面积=0”,长*宽); ,2、 结构成员的访问结构成员可分为两类,一是实例成员,一是静态成员。若成员名前有static关键字,则该成员为静态成员,否则为实例成员。静态成员通过结构名来访问,格式:结构名.静态成员名实例成员的访问是通过创建结构类型的变量来访问结构的实例成员。格式:结构名 标识符; 实例成员访问格式为:结构变量名.实例成员名,练习: 1. 声明结构类型的关键字为( )A classB doubleC structD int ,D,枚举类
6、型是用户自定义的数据类型,是一种允许用符号代表数据的值类型。枚举是指程序中某个变量具有一组确定的值,通过“枚举”可以将其值一一列出来。例如:将一个星期的7天分别用符号Monday、Tuesday、Wednesday、Thursday、Friday、Saturday和Sunday来表示。,枚举,1. 枚举类型的定义 枚举类型是一种用户自己定义的由一组指定常量集合组成的独特类型。格式:enum 枚举名枚举成员表;,例:enum WeekDaySun, Mon, Tue, Wed, Thu, Fri, Sat;注意:两个枚举成员名不能完全相同。,2. 枚举成员的赋值在定义的枚举类型中,每一个枚举成员
7、都有一个相对应的整数值,对于枚举成员对应的整数值,默认情况下C#规定第1个枚举成员的值取0,它后面的每一个枚举成员的值按加上1递增。例: enum WeekDay Sun, Mon, Tue, Wed, Thu, Fri, Sat; 中,其枚举成员Sun、Mon、Tue、Wed、Thu、Fri和Sat在执行程序时,分别被赋予整数值0、1、2、3、4、5和6。,例:输出枚举成员对应的整数值。 using System; enum color yellow, brown, blue, black, purple class EnumDemostatic void Main( )Console.Wr
8、iteLine(“yellow=0”, color.yellow);Console.WriteLine(“yellow=0”, (int)color.yellow);Console.WriteLine(“brown=0”, (int)color.brown);Console.WriteLine(“blue=0”, (int)color.blue);Console.WriteLine(“black=0”, (int)color.black);Console.WriteLine(“purple=0”, (int)color.purple);,注意:枚举成员的值在不经过显式转换前,是不会变换成整数值
9、的。,(1)为第1个枚举成员赋值 在定义枚举类型时,为第1个枚举成员赋值,它后面的每一个枚举成员的值按加1递增。 例: using System; enum color yellow=-1, brown, blue, black, purple class EnumDemo static void Main( )Console.WriteLine(“yellow=0”, color.yellow);Console.WriteLine(“yellow=0”, (int)color.yellow);Console.WriteLine(“brown=0”, (int)color.brown);Con
10、sole.WriteLine(“blue=0”, (int)color.blue);Console.WriteLine(“black=0”, (int)color.black);Console.WriteLine(“purple=0”, (int)color.purple);,(2)为某一个枚举成员赋值如果在定义枚举类型时,直接为某个枚举成员赋值,则其他枚举成员依次取值,如:enum color yellow, brown, blue, black=6, purple;,例: using System; enum color yellow, brown, blue, black=6, purp
11、le class EnumDemostatic void Main( )Console.WriteLine(“yellow=0”, color.yellow);Console.WriteLine(“yellow=0”, (int)color.yellow);Console.WriteLine(“brown=0”, (int)color.brown);Console.WriteLine(“blue=0”, (int)color.blue);Console.WriteLine(“black=0”, (int)color.black);Console.WriteLine(“purple=0”, (i
12、nt)color.purple);,(3)为多个枚举成员赋值在定义枚举类型时,还可以为多个枚举成员赋值。 例如:enum color yellow, brown=3, blue, black=-3, purple;,例:输出枚举成员对应的整数值。 using System; enum color yellow, brown=3, blue, black=-3, purpleclass EnumDemo static void Main( )Console.WriteLine(“yellow=0”, color.yellow);Console.WriteLine(“yellow=0”, (int
13、)color.yellow);Console.WriteLine(“brown=0”, (int)color.brown);Console.WriteLine(“blue=0”, (int)color.blue);Console.WriteLine(“black=0”, (int)color.black);Console.WriteLine(“purple=0”, (int)color.purple);,(4)为多个枚举成员赋同样的值在定义枚举类型时,可以让多个枚举成员具有同样的整数值,如:enum color yellow, brown=3, blue, black= blue, purpl
14、e;/这里black的整数值就为4,例:输出枚举成员对应的整数值。 using System; class EnumDemoenum coloryellow, brown=3, blue, black= blue, purplestatic void Main( )Console.WriteLine(“yellow=0”, color.yellow);Console.WriteLine(“yellow=0”, (int)color.yellow);Console.WriteLine(“brown=0”, (int)color.brown);Console.WriteLine(“blue=0”,
15、 (int)color.blue);Console.WriteLine(“black=0”, (int)color.black);Console.WriteLine(“purple=0”, (int)color.purple);,3. 枚举成员的访问可以通过枚举型变量和枚举名两种方式来访问枚举成员。 (1)通过变量访问枚举成员先要声明一个枚举型变量,形式如下:枚举类型名 变量名; 例:enum WeekDay Sun, Mon, Tue, Wed, Thu, Fri, Sat ;Weekday wd1; /声明一个枚举型变量wd1wd1=WeekDay.Sun; /给枚举型变量wd1赋值,例:
16、声明一个枚举类型,通过枚举型变量访问枚举成员。,enum Color Red,Green=10,Blue class Test static void Main() Console.Write(“请输入c的值:“);int c=int.Parse(Console.ReadLine(); /输入10Color b=(Color)c;Console.WriteLine(b);switch(b) case Color.Red:Console.WriteLine(“Red=“+(int)b); break;case Color.Green:Console.WriteLine(“Green=“+(int
17、)b); break;case Color.Blue:Console.WriteLine(“Blue=“+(int)b); break;default:Console.WriteLine(“Invalid color“); break; ,(2)通过枚举名访问枚举成员通过枚举名访问枚举成员的一般形式:枚举名.枚举成员;,练习:已知 enum Course Math, English, Computer, History, Chemistry=0, Philology, Philosophy Course cc; 则下列语句错误的是( )Aint a=(int)Course.English;Bc
18、c=Course.English+2;Ccc=5;Dbool b=Course.Math=Course.Chemistry;,引用类型 1. object类object类是系统提供的基类型,是所有类型的基类,C#中所有的类型都直接或间接派生于对象类型。对于任一个object变量,均可以赋以任何类型的值。double d=3.14;object obj1;obj1=d;obj1=k;对于object类型的变量,声明必须使用object关键字。,类类型,一个类类型包含数据成员,函数成员,嵌套类型,数据成员是常量,静态字段和事件。函数成员包括方法,属性,索引,操作浮,构造函数,析构函数。 C# 只允
19、许单继承,但是可以派生自多个接口,接口,一个接口定义了一个协议。一个实现了某个接口的类或结构必须符合它的协议。一个接口可以从多个基本接口继承,而一个类或结构也可以实现多个接口。接口可以包含方法、属性和索引等(即在接口中只能包含方法而不能包含变量)。接口自己不为它所定义的成员提供具体实现。接口只是指定类中必须被实现的成员。格式:接口修饰符 interface 接口名 :基接口名接口的成员;;,代表 (委托),委托,顾名思义,就是中间代理人的意思。通俗地说,委托是一个可以引用方法的对象,即是说委托可以调用它所指向的方法。 C#中委托的具体的步骤是: (1) 声明一个委托,其参数形式一定要和想要包含
20、的方法的参数形式一致。 (2) 定义所有你要定义的方法,其参数形式和第一步中声明的委托对象的参数形式必须相同。 (3) 创建委托对象并将所希望的方法包含在该委托对象中。 (4) 通过委托对象调用包含在其中的各个方法。,步骤1: 声明一个委托 格式:修饰符 delegate 返回类型 委托名(参数列表);例: public delegate void MyDelegate1(string input); public delegate double MyDelegate2( );声明一个委托的对象, 与声明一个普通类对象的方式一样:委托名 委托对象名;例: MyDelegate1 a; MyDe
21、legate2 b;,步骤2:定义方法,其参数形式和步骤1中声明的委托对象的必须相同 class MyClass1 public void dMethod1(string input) Console.WriteLine(“Method1传递的参数是 0“,input); public void dMethod2(string input) Console.WriteLine( Method1传递的参数是 0“,input); ,步骤3:创建一个委托对象并将上面的方法包含其中 例:MyClass1 c2=new MyClass1(); MyDelegate1 d1;d1 = new MyDel
22、egate1(c2.dMethod1); MyDelegate1 d2 = new MyDelegate1(c2.dMethod2); 步骤4:通过委托对象调用包含在其中的方法 例:d1(“abc“);d2(“123“);,下面这个例子就是将上面的4个步骤合在一起: using System; public delegate void MyDelegate1(string input); class MyClass1 public void dMethod1(string input)Console.WriteLine(“dMethod1传递的参数是 0“,input); public voi
23、d dMethod2(string input) Console.WriteLine( “dMethod2传递的参数是 0“,input); class Driver static void Main()MyClass1 c2=new MyClass1();? MyDelegate1 d1 = new MyDelegate1(c2.dMethod1);? MyDelegate1 d2 = new MyDelegate1(c2.dMethod2);? d1(“abc“);d2(“123“); ,运行结果如下:,字符串类型,String x=“123” String y=“123”; x=y?,x
24、,“123”,111222,111222,y,“123”,111228,111228,数组,string etcStr=“A“,“B“,“C“; etcStr0=“A“;etcStr1=“B“;etcStr2=“C“;int, arr=0,1,2,3,4,5 arr0,0=0;arr0,1=1; arr1,0=2;arr1,1=3; arr2,0=4;arr2,2=5;int nVar=5; int arrToo=new intnVar; 也可以!,装箱和拆箱,装箱转换装箱转换是指将一个值类型的数据隐式地转换成一个对象类型(object)的数据。例如:下面的两条语句就执行了装箱转换:int i
25、=518;object obj=i;,例:在程序中执行装箱转换。using System;class BoxingDemo static void Main( ) Console.WriteLine(“执行装箱转换:“);int k=200;object obj=k;k=300;Console.WriteLine(“obj=0“,obj);Console.WriteLine(“k=0“, k); ,2拆箱转换和装箱相反,拆箱转换是指将一个对象类型的数据显式地转换成一个值类型数据。例如: object obj=228; int k=(int)obj;,例:在程序中使用拆箱转换。using Sys
26、temclass UnboxingDemostatic void Main( )int k=228;object obj=k; /装箱转换int j=(int ) obj; /拆箱转换Console.WriteLine(“k=0tobj=1tj=2“, k, obj, j); ,该程序执行后,输出结果如下:k=228 obj=228 j=228,常量和变量,变量 和C/C+ 不同的是可以用 来说明一个关键字也是一个变量!C# 没有全局变量! 常量 可以是然后一种值类型和引用类型!,选择结构,选择结构的概念选择结构,是一种常用的主要基本结构,是计算机根据所给定选择条件为真与否,而决定从各实际可能
27、的不同操作分支中执行某一分支的相应操作。,条件语句 1if语句 语法形式:if (表达式)语句;说明:如果表达式的值为true,则执行后面if语句所控制的语句;如果表达式的值为false,则不执行if语句控制的语句,而直接跳转执行后面的语句。注意:如果if语句块中只有一条语句,则大括号“ ”可以省略。,编程:计算下面公式中的b的值。2a+1 (a 100)b= a (a 100),using System; class value static void Main( ) Console.Write(“请输入a的值:“);int a=int.Parse(Console.ReadLine();in
28、t b=a;if(a=100)b=2*a+1; Console.WriteLine(“b=0“,b); ,2ifelse语句 语法: if (表达式)语句块1; else 语句块2; 说明:如果表达式的值为true,则执行if语句所控制的语句块1;如果表达式的值为false,则执行else语句所控制的语句块2。,例:输入一个数,对该数进行四舍五入。using System; class Value static void Main( ) Console.WriteLine(“请输入a的值:”);double a=double.Parse(Console.ReadLine( );int b;if
29、(a-(int)a=0.5) b=(int)a+1; else b=(int)a; Console.WriteLine(“0进行四舍五入后的值为:1 “,a,b); ,在ifelse语句中可以嵌套使用多层ifelse语句,如:if (表达式1)if(表达式2) if(表达式3)语句1;else语句2;else语句3;else语句4;在使用这种结构时,要注意else和if的配对关系,其原则是:从第1个else开始,一个else总和它上面离它最近的可配对的if配对。,例: int a=int.Parse(Console.ReadLine( ); if (a0)if (a100)a=a-50;els
30、ea=a+10; /这个else与if (a100)相配 elsea=-a; / 这个else与if (a0)相配 Console.WriteLine(“a=”,a);,分支语句格式:switch(表达式)case 常量表达式1:语句1;break;case 常量表达式2:语句2;break;default:语句n;break; ,注意: C#要求每个case后使用break语句或跳转语句goto。所有常量表达式的值不能相同。,例:using System;class Demo public static void Main() Console.Write(“enter i=“);int i=
31、int.Parse(Console.ReadLine();switch(i) case 1:case 2:case 3:Console.WriteLine(“i is 1,2 or 3.“);break;case 4:Console.WriteLine(“ i is 4. “);break;,注意:在C#中,两个或更多的case语句可以共用同一程序代码:,循环结构循环是指在指定的条件下多次重复执行一组语句。被重复执行的一组语句称为循环体。采用循环结构可以解决一些按一定规则重复执行的问题。例如,统计一个班几十名学生,甚至全校几千名学生的学期成绩,如求平均分、不及格人数等4.4.1 循环结构的概念
32、循环结构按其循环体是否嵌套从属的子循环结构,可分为单循环结构和多重循环结构。,while语句和dowhile语句1while语句 语法格式:while (条件表达式)循环体,using System;class Sumwstatic void Main( )int n=1;while (n6)Console.WriteLine(“n=0”, n);n+;,例:写出下列程序的运行结果。,结果:,2do-while语句语法格式:do循环体;while(条件表达式);,using System;class Sum static void Main( ) int i=1, j;long m, sum=
33、0;do m=1;j=1;do m*=j;j+; while(j=i);sum+=m;i+; while (i=10);Console.WriteLine(“1!+2!+10!=0”, sum);,例:使用do-while语句,编程计算1!+2!+10!。,for语句和foreach语句 1for语句语法格式:for(表达式1;表达式2;表达式3) 循环体;,例:使用for循环语句,编程输出120的每个奇数的平方。,using System; class square static void Main( )int s;for (int i=1;i20;i+=2) s=i*i;Console.W
34、rite(“0t “, s);,2foreach语句foreach语句用于列举集合中的每一个元素,并且通过执行循环体对每一个元素进行操作。foreach语句只能对集合中的元素进行循环操作。foreach语句的一般语法格式如下:foreach (数据类型 标识符 in 表达式)循环体,using System; class Test static void Main( ) double Array=16,12,31,8,21;int intArray=1,2,3;foreach(int i in intArray) Console.WriteLine(Arrayi ); ,例:写出下列程序段的结
35、果:,条件编译 预处理方法 - using System; public class SquareSample public void CaleSquare(int nSideLength,out int nSquared) nSquared=nSideLength*nSideLength; public int CalcSquare(int nSideLength) return nSideLength*nSideLength; class SquareApp public static void Main() SquareSample sq=new SquareSample(); int
36、nSquared=0; #if CALC_W_OUT_PARAM sq.CalcSquare(20.out nSquared); #else nSquared=sq.CalcSquare(15); #endif Console.WriteLine(nSquared.ToString(); /由于没有定义CALC_W_OUT_PARAM,所以编译的时候要用如下的命令 /csc /define:CALC_W_OUT_PARAM define.cs,条件编译 预处理方法 /#define DEBUG #define RELEASE #define DEMOVERSION #if DEBUG #und
37、ef DEMOVERSION #endif using System; class Demo public static void Main() #if DEBUG Console.WriteLine(“Debug version“); #elif RELEASE #endif ,条件属性 #define DEBUG using System; class Info conditional(“DEBUG“) public static void Trace(string strMessage) Console.WriteLine(strMessage); conditional(“DEBUG“) public static void TraceX(string strFormat,params object ,