asp.net3.5
程序设计:《C#和.
NET3.5高级程序设计(第4版)》笔记4
疯狂代码http://CrazyCoder.cn/?:http:/CrazyCoder.cn/BlogDigest/Article76606.html;第四章C#核心编程结构2本章对前一章进行补充,介绍了构造C#方法的细节,探讨了方法的各种关键字和方法重载的主题,之后介绍数组类型,也介绍了枚举类型、结构类型,然后详细介绍了值类型和引用类型之间区别,最后探讨了可空数据类型以及?和??运算符。4.1方法重载和参数修饰符C#中有四种参数修饰符,分别为:(无),此时为值传递。数据的副本就会被传入函数,至于到底复制什么,取决于参数是值类型还是引用类型,前者复制值类型的本身,后者复制的是引用(指针)。out,输出参数,若参数用out声明,则调用时也必须加上out。使用前不用赋值,函数退出时,要给参数赋值,否则编译错误。ref,引用参数,和out类似,区别主要有:输出参数(out)无需(不是必须,赋的值也会在后面重新赋值时覆盖)传递前初始化,退出时必须给他赋值;引用参数(ref)必须在传递前初始化,退出时可以(不是必须)改变他的值。可以看出,以上两种方式的优点就是,只使用一次方法就可以获得多个返回值!而常规方式,只能用return返回一个值!注意,将一个值类型的参数用上述两个修饰符进行声明,不会出错,但是,没有任何意义,和第一种方式的结果是一样的,不会真的改变值类型,对于引用类型,则不同,具体看本章后面。params,参数数组。可以把可变数量的参数(相同类型)作为单个逻辑参数传给方法。需要强调的是,这种方式声明的参数数组,在调用时,可以有两种方式,一种是传入强类型的数组(和用常规数组作为参数时一致),另一种是以逗号分割的项
列表(这才是特有的方式),例如,下面的方法:staticdoublecalculateaverage(inti,parmasdouble[]values){}则调用时,可以用如下两种中任意一种哦:double[]b={1,2,3};calculateaverage(100,b);//第一种方式calculateaverage(100,1,2,3);//第二种方式第二种方式时,编译器会自动将后三个参数打包成数组,作为double[]参数传入。若不用params声明,第二种方式将出错!成员重载:是指一组名称相同,参数数量(或类型)不同。关键要确保方法的每一个版本都有不同的参数组(只是返回类型不同是不够唯一的),能够保证唯一的条件是:参数个数不同参数类型不同(int,folat.......)需要注意的是,虽然类型不同可以通过编译,但是若类型之间出现交集,看如下情形:;;;;;;;;;staticvoidww(intb);;;;;;;{Console.WriteLine("test1");};;;;;;;staticvoidww(uintb);;;;;;;{Console.WriteLine("test2");}则我无论用ww(1)还是ww(-1),是没法执行第二个重载方法的,因为这两个类型之间出现交集。参数修饰符不同(out,ref,“无”等)注:这是一些显而易见的组合,对于每一种搭配,时候产生歧义,感兴趣的可以继续研究一下。4.2数组数组当然是一组相同类型的数据点。下界从0开始。new(声明数组)后,若不显示填充,则每项都给予默认值。总结一下数组的初始化方法:(1)逐个填充int[]a=newint[3];//使用此方法时,必须指定数组大小;这样才能默认填充这么多个值,此时,所有数组中值均为0,下面可以对不想是默认的项逐个赋值。a[0]=1;a[1]=2;(2)花括号初始化以下三种方式均可:;int[]a=newint[]{1,2,3};int[]a=newint[3]{1,2,3};
int[]a={1,2,3};也就是说,不需要指定数组大小,因为可以通过花括号的项来推断;new关键字是可选的。若数组大小指定了,却和花括号中项数不一致,反而出错,因此,推荐第三种,简单!在c#数组中,可以定义引用类型的数组,如datatable类型,string类型,甚至是object的数组,这时候,不仅需要对整个数组进行实例化,还需要对其中每一个项进行实例化,记住,每一项还需要进行实例化哦。如:object[]myobject=newobject[2];myobject[0]=10;//此项为值类型,直接赋值myobject[1]=newdatatime(1988,1,3);//为引用类型,需要实例化多维数组:包括了矩形数组和交错数组。矩形数组:每一行的长度都相同的多维数组。int[,]a=newint[1,2];交错数组:包含一些内部数组,每一个都有各自的上界。int[][]a=newint[5][3];这些数组的声明方法和初始化,有兴趣的可以查看相关资料,这里不再赘述。另外,数组可以作为参数(返回值)。4.3枚举枚举用于创建一组符号名和已知数字值的类型。定义方法:enumemptype{manager,grnut=10,contractor,}注意,最后一个逗号可以有也可以没有!默认情况下,第一个元素若没有赋值,则被默认是0,若其中任意一个没有赋值,则默认是上一个成员的数值加1,则可以推断,contractor为11。这些值不一定连续,也不一定唯一,没有限制。默认时,枚举值的存储类型为int类型,若想更改,则可以使用冒号来设置,C#支持byte,sbyte,short,ushort,int,uint,long,ulong。使用方法:enumemptype:bytes{manager,grnut=10,contractor,}对于enum,我不经常使用,对它的用法,觉得也比较别扭。上面定义了一个emptype的枚举,但是使用时,却只能使用其中一个,可能还是对这种类型不太熟悉吧!如:emptypea=emptype.manager;若要获取枚举中的符号名名称,用a.tostring()即可,若要获取a对应的数值,必须根据底层存数类型,进行强制转换(byte)a,这是由于,虽然emptype中的各个符号对应的是数值,但是并非真的是数值类型,因此必须转换成为数值。4.4结构结构是可以包含许多数据字段和操作这些字段的成员的用户自定义类型。结构有许多类似于类的特性,可以看成是轻量级的类类型。结构可以定义构造函数,实现接口,还包含许多属性、方法、事件以及重载运算符。但是结构无法继承。初始化一个结构体,有两种方式,一种是创建变量后,为每一个公共字段数据赋值。例如定义一个结构体:;structpoint;;;;;;;{;;;;;;;;;;;publicinta;;;;;;;;;;;;publicintb;;;;;;;;;;;;publicvoiddisplay();;;;;;;;;;;{;;;;;;;;;;;;;;;Console.WriteLine("a:{0},b:{1}",a,b);;;;;;;;;;;;};;;;;;;;;;;;;;}则使用时:pointp;p.a=1;p.b=2;p.display();另外一种方式是使用new关键字来创建变量,他会调用结构的默认构造函数(因此,结构中不允许再定义没有参数的构造函数,也就是这个
系统提供的默认构造函数无法覆盖),并自动为公共字段赋予默认值。如:pointp=newpoint();p.display();还一种方式,就是利用自定义的构造函数,这需要在定义结构时显示进行定义才可使用。4.5值类型与引用类型值类型都隐式派生自system.valuetype,从而确保所有派生类型都分配在栈上而不是垃圾回收堆。其唯一目的是重写了由system.object定义的虚方法来使用基于值而不是基于引用的语法,重写会改变定义在基类中的虚(也可能是抽