C#高级教程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

通过本次课程,理解类的重要概念和相关知识,理解C#中高级类型(例如可空类型、泛型等),Lambda表达式和LINQ的原理和使用。//声明非静态类classNoStaticClass{}//声明静态类[表示该类能实例化,只能包含静态成员]staticclassStaticClass{}//声明抽象类[该类不可用new直接创建对象]abstractclassAbstractClass{}//声明封闭类[表示该类不可被继承]sealedclassSealedClass{}//abstract和sealed不可同时修饰一个类//static类不可和abstract或sealed同事修饰一个类classTest{//public表示在任何地方都可以访问publicInt字段publicintpublicInt=0;//private表示只能在类内部访问privateInt字段[默认是此项]privateintprivateInt=0;//protected表示在类内部或者Test的子类可访问protectedIntprotectedintprotectedInt=0;//在程序集内部可访问,比public低,比protected高internalintinternalInt=0;//protected和internal的合成protectedinternalintprotectedInternalInt=0;}//声明一个类型classNoStaticClass{publicNoStaticClass(){}publicNoStaticClass(intvalue){}}publicclassTest{staticvoidMain(){//使用new操作符创建一个类的实例(对象)//此操作会调用类的无参构造函数NoStaticClassmyClass1=newNoStaticClass();//调用类的有参构造函数NoStaticClassmyClass2=newNoStaticClass(2);}}•字段是与类或类的实例关联的变量。•使用static修饰符声明的字段定义了一个静态字段(staticfield)。一个静态字段只标识一个存储位置。无论对一个类创建多少个实例,它的静态字段永远都只有一个副本。•不使用static修饰符声明的字段定义了一个实例字段(instancefield)。类的每个实例都为该类的所有实例字段包含一个单独副本。•字段的初始化是在构造函数里面完成的,实例字段在实例构造器内初始化;静态字段在静态构造器初始化。publicclassColor{//静态字段[通过类型访问]publicstaticreadonlyColorBlack=newColor(0,0,0);//实例字段[通过类型的实例访问]privatebyter,g,b;publicColor(byter,byteg,byteb){this.r=r;this.g=g;this.b=b;}}•方法(method)是一种成员,用于实现可以由对象或类执行的计算或操作。•静态方法(staticmethod)通过类来访问;•实例方法(instancemethod)通过类的实例来访问。•方法具有一个参数(parameter)列表(可以为空),表示传递给该方法的值或变量引用•方法还具有一个返回类型(returntype),指定该方法计算和返回的值的类型。如果方法不返回值,则其返回类型为void。•方法的签名(signature)在声明该方法的类中必须唯一。方法的签名由方法的名称、类型参数的数目以及该方法的参数的数目、修饰符和类型组成。方法的签名不包含返回类型。•方法的几个知识点:•参数;•方法体和局部变量;•静态方法和实例方法;•虚方法、重写方法和抽象方法;•方法重载。•参数用于向方法传递值或变量引用。方法的参数从调用该方法时指定的实参(argument)获取它们的实际值。•四类参数:•值参数:用于传递输入参数。对值参数的修改不影响为该形参传递的实参。•引用参数:用于传递输入和输出参数。引用参数与实参变量表示同一存储位置。引用参数使用ref修饰符声明。•输出参数:用于传递输出参数。输出参数与引用参数类似。不同之处是输出参数的调用方可不提供参数初始值。输出参数是用out修饰符声明。•参数数组:允许向方法传递可变数量的实参。参数数组使用params修饰符声明。只有方法的最后一个参数才可以是参数数组,并且参数数组的类型必须是一维数组类型。classTest{//值参数staticvoidValueParameter(intvalue){value=100;}//引用参数staticvoidRefParameter(refintvalue){value=100;}//输出参数staticvoidOutParameter(outintvalue){value=100;}//输出参数staticvoidParameterArray(paramsint[]array){for(inti=0;iarray.Length;i++){Console.WriteLine(array[i]);}}}staticvoidMain(){intvalueParameter=0;intrefParameter=0;intoutParameter;//调用后valueParameter还是0ValueParameter(valueParameter);//调用后refParameter[必须初始化]为100RefParameter(refrefParameter);//调用后outParameter[不用初始化]为100OutParameter(outoutParameter);//可以传任意多个int类型的参数ParameterArray(1);//输出1ParameterArray(1,3,5,7);//输出1357}•方法体指定了在调用该方法时将执行的语句。•方法体可以声明仅用在该方法中使用的变量,这样的变量称为局部变量(localvariable),局部变量声明指定了类型名称、变量名称,还可指定初始值。•C#要求在对局部变量明确赋值之后才能使用。•方法可以使用return语句将控制返回到它的调用方。在返回void的方法中,return语句不能指定表达式。在返回非void的方法中,return语句必须含有一个计算返回值的表达式。usingSystem;classTest{staticvoidMain(){//声明并赋值局部变量inti=0;//只声明局部变量intj;Console.WriteLine(i);//0//编译报错:使用了未赋值的局部变量“j”Console.WriteLine(j);//方法返回:void方法可以省略returnreturn;}}•使用static修饰符声明的方法为静态方法(staticmethod)。静态方法不对特定实例进行操作,并且只能直接访问静态成员。通过类型进行调用。•不使用static修饰符声明的方法为实例方法(instancemethod)。实例方法对特定实例进行操作,并且能够访问静态成员和实例成员。在调用实例方法的实例上,可以通过this显式地访问该实例。通过对象进行调用。usingSystem;classTest{publicstaticvoidStaticMethod(){Console.WriteLine(我是静态方法);}publicvoidInstanceMethod(){Console.WriteLine(我是实例方法);}staticvoidMain(){//调用静态方法Test.StaticMethod();//调用实例方法Testtest=newTest();test.InstanceMethod();}}•“扩展方法”使你能向现有的类型“动态”添加方法,却不需要创建新的派生类型、重新编译或以直接修改原始类型的源代码。•扩展方法是一种特殊的静态方法,但可以其调用方式与调用普通的实例方法一样。•扩展方法中第一个参数为this,专用于指明此扩展方法所“适用”的类型,在扩展方法的实现代码中,可以用也可以不用。•扩展方法之所以能动态扩充现有数据类型的功能而又无需对原有数据类型进行“伤筋动骨”的改造,其关键在于编译器在后台所完成的大量工作。•在编译使用了扩展方法的代码时,编译器会将这些调用代码转换为对相应静态方法的调用。因此,在编译生成的程序集(DLL或EXE)中并不存在着一种特殊的调用扩展方法的指令。•与原始类型的方法具有相同名称和签名的扩展方法永远不会被调用。•一般情况下,多将扩展方法集中存入静态类中。•在需要使用扩展方法的地方,将保存扩展方法的静态类所在的命名空间引入:•using扩展方法所在的命名空间;•之后就可以直接使用扩展方法了。publicstaticclassMyExtensions{publicstaticstringUpperLower(thisstringstr,boolupperFirst){StringBuildernewString=newStringBuilder(str.Length);for(inti=0;istr.Length;i++){newString.Append(upperFirst?char.ToUpper(str[i]):char.ToLower(str[i]));upperFirst=!upperFirst;}returnnewString.ToString();}}stringinput=Console.ReadLine();Console.WriteLine(callingextensionmethodfor{0}:{1},input,input.UpperLower(true));•虚方法:若一个实例方法的声明中含有virtual修饰符,则称该方法为虚方法(virtualmethod)。•抽象方法:使用abstract修饰符进行声明,该方法没有方法体,并且只允许出现在同样被声明为abstract的类中。抽象方法必须在每个非抽象派生类中重写。•重写:虚方法和抽象方法可以在派生类中重写(override)。当某个实例方法声明包括override修饰符时,该方法将重写所继承的具有相同签名的虚方法。在调用一个虚方法或抽象方法是,该调用所涉及的实例的运行时类型(runtimetype)确定了要实际调用的方法实现。而在非虚方法调用中,实例的编译时类型(compile-timetype)负责做出此决定。abstractclassBaseClass{//虚方法publicvirtualvoidVirtualMethod(){Console.WriteLine(BaseClass.VirtualMethod);}//抽象方法publicabstractvoidAbstractMethod();}classSubClass:BaseClass{//重写虚方法publicoverridevoidVirtualMethod(){Console.WriteLine(SubClass.VirtualMethod);}publicoverridevoidAbstractMethod(){Console.WriteLine(重写抽象方法);}}classTest{staticvoidMain(){//声明类型为基类,实际类型为子类BaseClassbaseClass=newSubClass();//由实际类型决定调用子类还是父类方法//实际是SubClass类的对象。//SubClass.VirtualMethodbaseClass.VirtualMethod();//重写抽象方法baseClass.AbstractMethod();}}•方法重载(overloading)允许同一类中的多个方法具有相同名称,条件是这些方法具有唯一的签名。在编译一个重载方法的调用时,编译器使用重载决策(overload

1 / 80
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功