




已阅读5页,还剩50页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
478第一章 .NET Framework概述1、.NET Framework简介.NET Framework包含以下两个主要组件:公共语言运行时(CLR)统一的类库集除了CLR和类库之外,.NET Framework还包括编程语言和ASP.NET。其中支持.NET Framework的一些编程语言为C#、VC+、VB.NET和Jscript。2、.NET Framework的组件.NET Framework由框架类库(FCL)和公共语言运行时(CLR)这两个主要组件组成。3、C#中常用的命名空间 命名空间用来将具有相关功能的相似类在逻辑上进行分组。.NET Framework中所有命名空间基本上都是从称为System的公共命名空间形成的,System命名空间又称为根命名空间。下表是System根下的部分二级命名空间:命名空间说明System.Data处理数据访问和管理;在定义ADO.NET技术中起重要作用System.IO管理对文件和流的同步和异步访问System.Windows处理基于窗体的Windows创建System.Reflection包含用于从程序集里读取元数据的类System.Threading包含用于多线和编写的类System.Collections包含不同的接口和类,这些接口和类用来定义不同对象第二章 Visual Studio.NET 20031、C#应用程序文件简介 创建项目后将在“解决方案资源管理器”窗口显示该项目的内容,其中包括这些文件:Hello World.csproj:它是执行应用程序时运行的启动项目。因此,在方案资源管理顺中,引文件显示为粗体。App.ico:它是与项目关联的默认空白图标文件。AssemblyInfo.cs:该文件包含通用程序集信息。所有程序集属性都放置在些文件中。Class1.cs:包含类声明的认,也是我们编程中书写代码的主要文件,并且通常我们会将其重新命名。第三章 C#基础知识1、C#的基本数据类型:C#数据类型大小默认值示例Int有符号的32位整数0Int rating=20Float32位浮点数,精确到小数点后7位0.0FFloat temperature=40.6FDouble64位浮点数,精确到小数点后1520位0.0DDouble pressurePoint=30000.56641DDecimal128位浮点数,精确到小数点后2829位0.0MDecimal cashPaid=1200MByte无符号的8位整数0Byte gpa=2;Short有符号的16位整数0Short salary=3400;Long有符号的64位整数0LLong population=23451900; Bool布尔值,true或falseFalseBool IsManager=true;StringUnicode字符串-String color=”Orange”char单个Unicode字符0Char gender=M;注意:对于某些数据(如年龄),只就指定为正数。这种情况下就应使用无符号数据类型。例如,uint为无符号整型,ulong为长整型。2、C#中的变量访问修饰符 数据类型 变量名称; C#语言中的变量按如下方式声明:数据类型后面是一个名,它应符合下面编码规范。编码标准: 变量命名内联变量(在方法内声明的变量)必须以骆驼命名法声明,而类变量(也称为成员变量)也必须以骆驼命名法声明,但应以一个下划一开头。不应使用匈牙利命名法(如strName或iCount)命名变量。避免使用单个字符(如“x”或“y”)作为变量名,但for循环中除外。示例1:3、C#中的常量 const 数据类型 常量名称常量值; 常量以const关键字时行声明,后面接C#数据类型之一和赋值语句。 Const int maxMarks=100; 例如, 编码标准: 常量命名的规则如下: 带有私有访问修饰符的常量必须以骆驼命名法声明,并以一个下划线开头。带有修饰符、受保护修饰符的常量必须以帕斯卡命名法声明。 示例2: 演示如何计算钟摆周期。提示:示例中的程序用Math类的Sqrt()方法计算平方根。4、C#中数据类型的分类 C#中的数据类型分为两个基本类别,即值类型和引用类型。值类型的数据存储在内存的堆栈中,因此,值类型表示实际数据。引用类型表示指向存储在内存堆中的数据的指针或引用。值类型和引用类型的基本区别在于它们在内存中的存储方式。值类型只将值存放在内存中,这些值类型数据都存储在堆栈中。原始数据类型(如int和bool)都属于此类别。引用类型的内存单元中只存放内在堆中对象的地址,而对象本身存放在内在堆中。如果引用类型变量的内容赋值是null,则表示未引用任何对象。将一个数值类型变量的内容赋值给另一个数据类型变量时,变量值被拷贝。将一个引用类型变量的内容赋值给另一个引用类型时,只是变量的内存地址被拷贝。示例3:演示值类型数据类型的用法。在Test()方法内修改变量val的值不会反映到Main()方法内。这是因为int型是一种值类型,将该变量传递给Test()方法时,只传递该变量的副本。因此,即使在Test()方法内该变量的值改变了,由于它属于值类型,也不会反映到Main()方法内示例4:演示引用数据类型的用法变量Val的值是200,这是因为传递给方法的参数属于object类型。Object类型属于引用数据类型,因此在传递该参数时,不是传递变量值的副本,而是传递该对象的引用(又称地址)。在“ReferenceDemo.cs”的Test()方法内所做的修改会反映到Main()方法内下表总结了值类型和引用类型的一般特点:特点值类型引用类型变量存放的内容实际值引用内存单元内联(堆栈)堆默认值0空传递给方法的参数复制值复制引用第四个特点表明,对值类型执行“”运算将把值复制给目标变量,而对引用类型执行赋值去运算将把对象的引用复制给目标变量。5、装箱和拆箱 装箱是允许将值类型(如整数)作为引用类型(如对象)进行处理的过程,而拆箱是允许将引用类型作为值类型进行处理的过程。代码片段1和2演示装箱和拆箱的概念。Int val =100;Object obj =val;Console.WriteLine (“对象的值0”,obj);代码片段1:Int val =100;Object obj =val;Int num =(int)obj;Console.writeline (“num:0”,num);这里,int 变量val的值被赋给object变量obj。将值类型(显式或隐式)转换为引用类型的一过程就称为装箱。代码片段2:当将val的值赋给obj对象时,不需要进行显式装箱,系统将自动装箱。但是将obj对象的值赋给num时,则需要进行拆箱,因为obj属于引用类型,而num属于值类型。6、运算符的分类一元运算符公一个操作数。+和都是C#语言中的一元运算符。二元运算符用于处理两个操作数。C#中常用的二元去处符为+、*、/和%表:前置和后置自加/自减运算符表达式类型计算方法结果(假定num1的值为5)Num2=+num1;前置自加Num1=num1+1;Num2=num1;Num2=6;Num1=6;Num2=num1+;后置自加Num2=num1;Num1=num1+1;Num2=5;Num1=6;Num2= -num1;前置自减Num1=num1-1;Num2=num1;Num2=4;Num1=4;Num2=num1-;后置自减Num2=num1;Num1=num1-1;Num2=5;Num1=4;表:运算符的分类类别运算符说明表达式算术运算符+用于加法运算(如果两个操作数是字符串,则该去处符用作字符串连接运算符,将一个符串添加到另一个字符串的末尾)操作数1 + 操作数2用于执行减法运算操作数1操作数2*用于执行乘法运算操作数1 * 操作数2/用于获得进行除法运算并得到商操作数1 / 操作数2%用于获得进行除法运算后的余数操作数1 % 操作数2+用于将操作数加1操作数1+或+操作数1-用于将操作数减1操作数1或操作数1用于将一个数按位取反操作数1比较运算符用于检查一个数是否大于另一个数操作数1操作数2用于检查一个数是否小于另一个数操作数1=用于检查一个数是否大于或等于另一个数操作数1=操作数2=用于检查一个数是否小于或等于另一个数操作数1=操作数2用于检查两个值是否相等操作数1=操作数2!=用于检查两个值是否不等操作数!=操作数2三元运算符(条件运算符)?:检查给出的第一个表达式expression是否为真。如果为真,则运算结果为operand1,否则运算结果为operand2。这是唯一带有三个操作数的运算符表达式?操作数1:操作数2赋值运算符给变量赋值操作数1操作数2逻辑运算符&对两个表达式执行逻辑“与”运算,该运算符用于检查是否两个表达式都为真操作数1&操作数2|对两个表达式执行逻辑或运算,该运算符用于检查两个表达式中是否至少有一个为真操作数1 | 操作数2!对表达式执行逻辑“非”运算。该运算符用于检查特定表达式取反后是否为真!操作数1强制转换运算符( )用于将操作数强制转换为给定的数据类型(数据类型)操作数成员访问运算符.用于访问数据结构的成员数据结构或者对象成员表:快捷运算符 运算符计算方法表达式求值结果(假定X10)+=运算结果操作数1+ 操作数2X += 5X = X + 515-=运算结果操作数1操作数2X -= 5X = X - 55*=运算结果操作数1* 操作数2X *= 5X = X * 550/=运算结果操作数1 / 操作数2X /= 5X = X / 52%=运算结果操作数1%操作数2X %= 5X = X % 507、运算符的优先级优先级(1为最高级)说明运算符结合性1括号( )从左到右2自加/自减运算符+ / -从右到左3乘法运算符除法运算符邓模运算符*/%从左到右4加法运算符减法运算符+-从左到右5小于小于等于大于大于等于=从左到右6等于不等于=!=从左到右从左到右7逻辑与&从左到右8逻辑或|从左到右9赋值运算符和快捷运算符= += *= /= %= -=从右到左8、C#中的选择语句 if else C#中if结构的语法如下:If (表达式)/ 表达式的计算结果为真时执行的一个或多个语句else/表达式的计算结果为假时执行的一个或多个语句 在C#中,表达式的计算结果必须为布尔类型。代码片段3 将有助于理解这一点。String val = “hello”;If (val)Console.WriteLine (“该值为 True”);If (val = = “hello”) Console.WriteLine (“该值为 Trre”);代码片段3:如果编译器遇到第一个if语句,将出现以下错误:错误 CS0029:无法将”string”类型隐式转换为”bool”类型由于第一个if语句中的表达式str的计算结果不是一个布尔值,因此出错。由于第二个if语句的计算结果为True或False,因此该语句未出现任何编译错误。 switch case C#中switch结构的语法为:Switch (变量)Case 值1:/ 语句Break;Case 值2:/ 语句Break;Case / Default: / 语句 Break; 在C#中,必须为每个case块指定一个跳转语句(如 Goto语句或break语句),否则,将出现编译器错误。 但是,如果case标签堆叠在一起,则不必指定任何 跳转语句,如下所示:Switch (variable)Case 0:Case 1:/ 执行某操作; 在两个case标签之间,可以有一个或多个语句。不必用大括号将这些语句组合起来。Default子句用于指定找不到匹配项的情况下将执行的动作。Switch(weekDay)Case 1:Console.WriteLine(“您已选择星期一”);Break;Case 2:Console.WriteLine(“您已星期二”);Break;Default:Console.WriteLine(“默认情况下选择星期日!”);Break;代码片段4:9、C#中的循环结构 C#语言中的switch语句与C语言中的swithc语句的一个主要区别在于,前者允许使用string类型的表达式。与C和Java中的循环结构不同的是,C#中的循环必须包含布尔条件,就像C#的if结构一样,可以在循环中指定一个break语句,便于随时中断循环。Continue语句可用于跳过当前循环并开始下一循环。代码片段5:演示了如何使用break语句和continue语句。Int count = 0;Int i = 1;While (true)Cont += I;/ 如果i能被10整除,则此轮循环路过,执行下一轮循环If (i % 10 = 0Continue;/ 如果count 大于等于100则终止循环If ( count = 100)Break; i +; Do/ 语句 while (条件)While (条件)/ 语句 while循环 dowhile循环For (初始值;条件;增/减)/ 语句 for循环 foreach循环Foreach (类型 元素 (变量名) in 集合或者数组)/ 语句 Foreach循环一般用于遍历整个集合或数组。该循环不能用于改变集合或数组的内容。Foreach结构的语法如下:示例5:演示如何在C#中声明和使用foreach循环。示例5中,foreach循环用于遍历用户提供的字符串input。此循环使用Char结构的内置方法IsLetter( )、IsDigit( )、IsPunctuation( )检查该字符串中的字母、数字和标点符号。10、数组数据类型 数组的大小或者容量 变量名;数组是同一数据类型的一组值。C#中的数组属于引用类型。数组声明如下:Int 6 arrayHere;代码片段6:String array2;Array2 =new string5;在代码片段6中,整型数组已被声明含有6个元素。但在C#中,声明数组时是否定义数组大小是可选的。这意味着数组中的元素个数也可以稍后在程序中指定。代码片段7:代码片段8:演示在数组声明阶段初始化数组String array3=“top”,”down”,”left”,”right”;数组命名的编码标准:数组必须以骆驼命名声明。例如:string4 nameArray=new String( );示例6:演示如何在C#中声明和使用数组11、结构类对实现对象很有用。但是,胃时候需要将一个对象用作一种内置数据类型,以使加快分配,而不会出现过多的引用重载和开销。C#的结构可以在其内部定义方法。学习代码片段9以理解此概念。Struct StructName Public int structDataMember;/结构中显示声明的构造函数必须带有参数Public void StructMethod(参数列表)/实现代码片段9:从代码片段9可以看出,StructName结构包含一个方法和一个数据成员。结构确实具有某些局限性。结构无法像类一样实现继承。其次,结构属于值类型,而类属于引用类型。在C#中,值类型实际上是System命名空间中的结构。例如,long类型是System.Int64结构的别名。结构命名的编码标准如下:结构必须以帕斯卡命名法声明。用名词或名词短语作为结构名称。11、枚举枚举是一组已听数值常量,它们有助于定义具有一组特定值的数据类型。假设一个程序只要求接收5个值(如Monday、Tuesday、Wednesday、Thursday和Friday)作为工作日的值。通过指定一个由这些特定值组成的枚举(如WeekDays),并编写一个只接收此枚举作为参数的方法,就可以实现。Public class Holiday Public enum WeekDays Monday, Tuesday, Wednesday, Thursday, Friday Public void GetWeekDays(String EmpName,WeekDays DayOff) / 处理工作日 Public static void Main( ) Holiday objHoliday = new Holiady( );objHoliday.GetWeekDays(“Richie”,Holiday.WeekDays.Wednesday); 代码片段10:C#中的枚举与C中的枚举一样,包含与值关联的数字。默认情况下,将0值赋给枚举对象的第一个元素,然后对每个后续的枚举元素按1递增。但是,也可以在初始化阶段将其指定为其他值。因此,代码片段10可以修改为代码片段11.Public enum WeekDays Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5代码片段11:枚举命名的编码标准如下:枚举必须以帕斯卡命名法声明枚举符中的可选项也必须以帕斯卡命名声明第四章 在C#中实现OOP概念1、C#的对象和类访问修饰符 class / 类的主体 类是对一组具有相同属性和行为的对象的描述。类的内容称为类的成员。声明类的语法如下: 其中修饰符可以是私有访问修饰符、受保护的访问修饰符、公共访问修饰符或内部修饰符,它是可选的。注意:不公简单变量(非引用型变量)可以作为类的成员变量,复杂变量(其他的类,引用型变量)也可以作为类的成员变量,也就是说类的成员变量也可以是一个类。类命名的编码惯例如下:给类使应使用帕斯卡命名法。确保类的名称是一个名词。Customer、Book、User、Employee、Student和UserName等是有效的类名代码片段1显示现实对象Employee声明为一个类。Class Employee/ 类的主体代码片段1:类的主体包含成员变量和成员方法。声明成员变量的语法如下:访问修饰符 数据类型 成员变量;编码惯例:成员变量命名给公共成员变量、受保护的成员变量或内部成员变量命名应使用帕斯卡命名法。如Score、Name和Status均为有效的成员变量名。给私有成员变量命名应使用骆驼命名法,并以下划线开头。例如 _age、_length和_radius等。代码片段2显示如何声明包含成员变量的类。Class EmployeePrivate string _name;Private char _gender;Private string _qualification;Private uint _salary;代码片段2:此时,Employee类包含4个成员变量:_name、_gender、_qualification和_salary代码片段3:显示如何创建对象访问该对象的成员变量./ 创建Employee类的对象Employee objEmployee =new Employee( );/ 访问成员变量objEmployee._name =”张亮影”:objEmployee._gender =M;objEmployee._salary =5500;objEmployee._qualification =”ACCPS3”;.2、访问修饰符表:访问修饰符(从上到下为可访性由大到小)访问修饰符说明Public可被所属类的成员以及不属于类的成员访问Internal可当前程序集访问Protected可被所属在或派生自所属类型访问private仅所属类的成员才可以访问Public string emName =”张亮影”; /public变量Protected bool department /protected 变量Private int empCode; /private变量 以下声明说明如何在C#程序中使用访问修饰符。如果对类不指定访问修饰符,则类的默认访问修饰符为internal,但是类成员的默认访问修饰符为private。3、构造函数和析构函数访问修饰符 ClassName( ) / 构造函数的主体 代码片段3 说明了如何初始化成员变量,但这些变量都是使用点符号来显式初始化的。有时候可能需要将变量初始化为某个默认值。例如,大多数公司要求的招聘条件为“大学毕业生”。在这种情况下,需要有一种机制自动将_qualification变量初始化为默认值“大学毕业生”。C#提供了一个名为构造函数的结构来自动初始化成员变量,但构造函数是类中的一种特殊方法,每次创建类的实例时都会调用此方法。构造函数与类同名,它不返回任何值。声明构造函数的语法如下:Employee( ) _qualification =”大学毕业生”;构造函数的主体包含一个或多个用于初始化成员变量的语句。代码片段4说明构造函数的声明和成员变量的初始化。代码片段4定义的构造函数称为默认构造函数。这种构造函数不接受任何参数,因此也称为无参数构造函数。如果类未定义默认构造函数,运行库将自动提供默认构造函数。示例1:演示默认构造函数的用法Employee objEmployee =new Employee( );注意下面的代码行:Employee objEmployee;此代码行用于调用构造函数。类的构造函数是在对象初始化的时候(定义类的时候)调用的。只声明而不实例化对象则不会调用构造函数。如下面代码行:objEmployee =new Employee( );此时只是声明了对象,还没有调用构造函数。进行下一步。这时候实例化对象,才调用了造函数。构造函数一般情况下是用来寝化成员变量的,但是也可以根据需要执行其他的动作。 带参数的构造函数构造函数可以没有参数,也可以有一个或一个以上的参数。例如,在运行时可以将“大学毕业生”值传递给_qualification实例变量,方式如下:Employee objEmployee =new Employee(“大学毕业生”);访问修饰符 类名 (参数列表) / 构造函数的主体但此时的构造函数语法与以下语法类似:其中“参数列表”是一系列用逗号分隔的变量声明。例如,代码片段5显示如何定义Employee构造函数以接受赋给_qualification实例变量的值。Class Employee Employee(string qualification) _qualification = qualification; 代码片段5:示例2:演示默认构造函数和带参数的构造函数的用法。示例2定义了一个默认构造函数和一个带参数构造函数。Main()方法创建了objGradusate和objMBA对象。通过使用默认构造函数来创建/实例化objGraduate对象,通过使用带参数的构造函数来实例化objMBA对象。由于objMBA是使用带参数的构造函数来实例化的,它的_qualification变量的值显示为“工商管理学硕士”,而objGraduate的_qualifictaion变量的值显示为“大学毕业生”。输出结果如下:代码如下: 析构函数析构函数是C#的另一种特殊方法,用于执行清除操作。析构函数的声明方式与构造函数的相同,只是在类名前加上。声明析构函数的语法如下: 类名( )/ 析构函数注意,析构函数不接受任何参数,也不带任何访问修饰符。一个类只能有一个析构函数。 析构函数不能重载。析构函数不能显式或手动调用,只能由垃圾回收器自动调用。提示:垃圾回收器是在后台运行的低优先级线程,用于释放不再使用或引用的对象所占用的内存。代码片段6:显示Employee类的析构函数。Employee( )/ 实现析构函数访问修饰符 返回类型 (参数列表) / 方法的主体4、方法 声明方法语法如下:编码惯例:给成员方法命名应使用帕斯卡命名法。请确保方法的名称为动词或动词与对象组合,例如ListDetails( )、GetArrayValue( )、Display( )等均为有效的成员方法名代码片段7:演示如何定义类中的方法Class point Int x; Int y; Void Assign( ) System.Console.WriteLine(“”); X = int.Parse(System.Colsole.ReadLine( ); Y = int.Parse(System.Colsole.ReadLine( ); 代码片段7定义了Assign( )方法 该方法不返回任何值,因此声明为void,它也不接受任何参数。Assign( )方法接受某个点的坐标。此处的int.Parse( )方法用于将接受的值从字符串格式转换为整数格式。 调用方法要调用C#方法,首先要创建对象的实例,再使用点符号来调用方法。调用方法对象名.方法名 (参数列表);的语法如下: 示例3:演示如何声明和调用方法以用如何传递和返回对象。 示例3在Add( )方法内使用return语句。Return语句用于将控制权移交回调用程序。在这种情况下,控制权就移交回Main( )方法。ComplexNumber类定义real和imaginary两个变量,还定义一个构造函数,用于将这两个实例变量初始化为0。为接受这两个变量的值,定义了一个名为Accept( )的方法。showResult( )方法用于显示real和imaginary变量的值。两个复数相加之和存储在objParam1对象中,然后该对象返回给Mian( )方法。在Main( )方法中,返回的对象存储在objTemp对象中,并通过调用showResult( )方法来显示相加之和。Return 表达式;Return语句的语法如下:其中表达式的数据类型与方法的返回类型应该一致。如果方法声明包含返回类型,则方法的主体应该至少包含一条return语句。在示例3中,Add( )方法返回ComplexNumber类型的对象,因此,Add( )方法的返回类型为ComplexNumber。、方法重载多个方法共用一个名称但对不同数据执行相似的功能,这种概念称为方法重载。不同方法根据方法签名来识别。方法签名包括对方法的声明。每个重载方法的方法签名都应该是唯一的。注意:不能根据返回类型来重载方法,这样编译器是不允许,会报编译错误.Class BillPayment Void PayBill (int telephoneNumber) / 支付固定话费的方法 Void PayBill (long consumerNumber) / 支付电费的方法 Void PayBill (long consumerNumber,double amount) / 支付移动话费的方法 .代码片段:代码片段8显示了几个PayBill( )方法,分别用于支付固定电话费、电费和移动电话费。 基于不同数量的参数的方法重载示例4:演示根据不同数量的参数来重载方法 基于不同类型的参数的方法的重载示例5: 静态方法静态方法就是一个类的实例共享的方法。定义静态方法的语法如下:访问修饰符 static 返回类型 (参数列表)访问静态方法的时候不需要建立类的实例,采取“类名.方法名”即可访问,我们经常用的Console.Write( )即是Console类的一个静态方法。6、命名空间 在代码片段9中显示了Sony和Samsung两个制造商。它们都销售Television和WalkMan,但两个类不能有相同的名称。因此,在每个类名前加上相应的品牌名称。在这种情况下,可以发现名称变长了而且难于维护。Class SamsungTelevision Class SamsungWalMan Class SonyTelevisionClass SonyWalkMan 代码片段9:另一个途径是使用命名空间,命名空 间除了可以避免冲突外,还有助于组 织代码。 代码片段10:演示命名空间如何简化名称冲突的解决方法Namespace Sony Class Television Class Television Namespace Samsung Class Television Class Television 命名空间的语法如下:Namespace 命名空间的名称 / 该命名空间的的所有类都放在这里 示例6:演示命名空间的用法示例6在Samsung命名空间下定义Monitor类。还定义ListModels( )方法,用于显示供应的Samsung牌显示器的规格。选择“项目”“添加类”,为此项目添加一个名为Monitor的类。将默认命名空间重命名为Sony,将Monitor.cs文件重命名为Sony.cs。示例7:示例7定义的Monitor类与Samsung命名空间中的类同名。这里的Monitor类定义了一个ListModelStocks( )方法,用来显示供应的Sony牌显示器的规格和数量。在这个类中,特意保留了Main( )方法来说明在一个项目中可以有多个Main( )方法。该项目包含两个Main( )方法,如果直接运行将提示错误。因此,必须为该项目设定一个启动对象。选择“项目”“Example6属性”,然后在“启动对象”组合框中选择“Sony.Monitor”第5章 C#中的继承1、继承 继承是允许重用现有类去创建新类的过程。分类的原则是一个类派生出来的子类具有这个类的所有公共属性。继承遵循代码重用原则。使用继承无需从头开始创建新类,便可以在现有类的基础上添加新方法、属性和事件(事件是对用户操作的响应)。创建新类所根据的基础类称为基类或父类,新建的类则称为派生类或子类。 继承C#中的类C#不支持多重继承。多重继承是从多个类中派生出新类的过程。在代码片段1中,在职研究生(Graduate)类试图从多个类派生出来:学员(Student)和职员(Employee)。而C#是不允许多重继承的,这样就可能会出错。/ 错误,只允许一个其类Public class Graduate:Student,Employ 代码片段1提示:C#类始终继承自一个基类(如果未在声明中指定一个基类,则继承自System.Object)。示例1:演示如何在C#中实现单一继承在示例1中,Student是从Person这个类中派生出来的。Person类具有GetInfo( )和DispInfo( )方法及_name和_age等成员变量。在上例中,我们创建了Student类的一个对象objStudent,我们就可以通过使用这个对象来访问Person类的GetInfo( )和DispInfo( )方法,因为Student类继承自Person类示例2:在示例2中新建了一个UnderGraduate类,它是从Student类中派生出来的。这个类用于检查一个期望升级的本科生是否符合升级要求。因为UnderGraduate派生自Student,而Student又派生自Person,所以UnderGraduate能够访问Student和Person的所有功能。这里,UnderGraduate的ChkElgbl( )方法访问Student的GetMarks( )方法,以验证该学生是否符合升级要求。因此,C#中的派生类同时兼具其间接基类的所有成员(私有成员除外)的功能。Base关键字从派生类中访问基类成员。即使基类的方法已居派生类中重写,仍可以使用base关键字调用。而且,在创建派生类的实例时,可以使用base关键字调用基类的构造函数。使用base关键字只能访问基类的构造函数、实例方法或实例属性,不能访问基类的静态方法。 调用基类的构造函数构造函数用于实例化类的成员字段。如果对类没有定义显式构造函数,则编译器将发挥作用并提供默认的构造函数,以初始化这些类的成员字段。在这种情况下,其实编译器做了很多工作,它需要逐一向上浏览整个上级类的结构,以将每个类的所有字段都初始化为其默认值。但是,如果显式添加了构造函数,就可以有交控制整个构造过程。示例3:演示如何在派生类中进行构造基类通常都需要初始化,示例3中基类Person可能首先初始化这个人的姓名和年龄。因此,它提供了一个构造函数以完成所需的初始化工作。派生类除了继承基类的所有字段外,还添加了它们自己的字段。在创建一个派生类对象时,必须初始化该对象的派生类部分和基类部分。通过使用base()语法,派生类的构造函数可以显式调用基类的构造函数。在必要情况下,可利用它来初始化字段。运行时,将首先执行基类的构造函数,然后才执行派生类构造函数的主体。我们可以为常规方法声明参数,同样我们也可以在构造函数以及调用的基类构造函数中声明参数,如下所示:Public Student (string name, uint age, uint id) : base(name,age)2、C#中方法的重写 “重写”基类方法就是修改它的实现或者说在派生类中对它时行重新编写。关键字override Override关键字用于修改方法,具有override关键字修改的方法是对基类中同名方法的新实现,基类中同名方法必须声明为virtual或abstract(后面将讲到)类型。给基类中的方法添加virtual关键字表示可以在派生类中重写它的实现。默认情况下,C#方法并非virtual类型,因此不能重写。Public virtual void SomeMethod( )基类方法的可访问级别并不因重写它的方法而改变。它们的访问修饰符相同,例如:Private override void SomeMethod( ) 不能重写为:注意:new、static和virtual关键字不能与override访问修饰符一同使用。关键字virtual访问修饰符 virtual 返回类型 方法名称 参数列表 / 虚拟方法的实现Virtual关键字用于将方法定义为支持多态。如上所述,virtual关键字用于对一个类中可修改的方法的声明,这种方法称为虚拟方法。子类可以使用override自由实现它们各自版本的虚拟方法。声明虚拟方法的语法如下: 关键字newNew关键字可用作运算或访问修饰符。New访问修饰会用于显式隐藏继承自基类的成员,即如果派生类成员的名称与基类成员名称相同,new会将派生类成员识别为一个全新的成员。提示:在一个方法中同时使用new和override将会出错。总的来说,就明确new访问修饰符的真正目的是为了隐藏基类方法。反之,如果将一个方法声明为new,而它实际上并没有隐藏基类方法,并且编译器也产生了警告,这时应该删除new访问修饰符以消除警告。示例4:使用base、override和virtual关键字演示方法重写。示例4显示的Employee类使用了EmpInfo虚拟方法,DervEmployee派生类重写了EmpInfo。派生类的重写方法包含base.EmpInfo( )调用,它调用Employee类中被重写的方法。另请注意,objDervEmployee派生类实例是赋给Employee类的objEmployee引用。此时,使用objEmployee引用调用EmpInfo时,会再次调用DervEmployee类的EmpInfo方法。这是因为决定调用的方法实现是DervEmployee实例的运行时类型,而不是Employee实例编译时类型。3、抽象类和抽象方法 不能被实例化的类称为抽象类,抽象类是派生类的基础。这些抽象类用于创建蓝本或者说模板,以派生出其他类。如果要将一个类指定为抽象类,则必须使用abstract关键字。将abstract访问修饰符与定义类配合使用的语法如下:Abstract class 一个抽象类可以同时包含抽象方法和非抽象方法。抽象方法的目的在于指定派生类必须实现与这一方法关联的行为。抽象方法只在派生类中真正实现,这表明抽象方法只存放函数原型(方法的返回类型,使用的名称及参数),但不涉及主体代码(方法的实现,定义方法做什么的代码)。派生自抽象烦扰类需要实现其基类的抽象方法,才能实例化对象。使用override关键字可在派生类中实现抽象方法,经override声明重写的方法称为重写基类方法,其签名必须与override方法的签名相同。示例5:演示在C#中派生类如何定义并实现抽象类在示例中,Derv类派生自ABC抽象类,在Mai
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 机器设备购买合同(标准版)
- 林地承包合同(标准版)
- 体育场馆租赁合同协议文本
- 大众旅游产品分销合作合同
- 标准化住房租赁合同条款修改指南
- 担保合同详细版本范本8篇
- 展览合作协议范本7篇
- 搭板过程中出事责任和业主无关的合同8篇
- 爱心基金会捐赠合同协议书范本7篇
- GB/T 31270.11-2025化学农药环境安全评价试验准则第11部分:家蚕急性毒性试验
- 重症自身免疫性脑炎监测与治疗中国专家共识(2024版)解读
- 机动车检测工资格证考试题(附答案)
- 护士沟通技巧与人文关怀护理课件
- 2025年上半年海南三亚市知识产权保护中心选聘事业单位6人重点基础提升(共500题)附带答案详解
- 2025年辽宁现代服务职业技术学院单招综合素质考试题库附答案
- 电力电缆模拟题及答案
- 2025年药物制剂工(中级)考试题库(附答案)
- 仿古建筑施工常见问题及应对策略
- 辽宁省沈阳市2024-2025学年八年级上学期期末考试英语试题(含答案无听力原文及音频)
- 小班晨间活动体能大循环
- 绿化小型工程合同范例
评论
0/150
提交评论