《net面向对象程序设计3方法与作用域2》由会员分享,可在线阅读,更多相关《net面向对象程序设计3方法与作用域2(29页珍藏版)》请在金锄头文库上搜索。
1、NetNet面向对象程序设计面向对象程序设计3 3方方法与作用域法与作用域201020112201020112第第3章章 方法和作用域方法和作用域After completing this chapter, you will be able to:Declare and call methods.Pass information to a method.Return information from a method.Define local and class scope.Use the integrated debugger to step in and out of methods as
2、 they run.23.1 3.1 创建方法创建方法方法是一个具名的语句序列包括方法名和方法体两部分方法名用英语描述了方法的用途方法的主体包含方法被调用时实际执行的语句3.1.1 3.1.1 声明方法声明方法C#方法的语法格式returnType methodName(parameterList)/这里添加方法主体语句注意:C#不支持全局方法,所有的方法都必须在一个类的内部,否则代码无法编译必须显式指定任何一个参数的类型和整个方法的返回值类型,不能使用var如果不返回任何值,必须使用void3.1.2 3.1.2 从方法返回数据从方法返回数据如果希望一个方法返回数据,必须在方法内部写一个re
3、turn语句例如:int addValues(int leftHandSide, int rightHandSide) / . return leftHandSide + rightHandSide;注意:return表达式的类型必须与方法的返回值类型相同,否则无法编译return将导致方法结束,所以最好放在方法尾部,否则return后的任何语句都不会被执行如果不希望返回数据,可以直接写return,然后紧跟一个分号例如:void showResult(int answer)/ display the answer.return;当然也可以省略return,因为一旦执行到方法块的尾部,方法会自
4、动结束下面练习P45页的例子补充:补充:C#中将字符串转换成为整数的几种方法对比中将字符串转换成为整数的几种方法对比Int32.TryParse() Int32.Parse() Convert.ToInt32()string myString=“1234”;int myInt=0;/第一种方法myInt=Convert.ToInt32(myString);Response.Write(myInt+”);/第二种方法myInt=Int32.Parse(myString);Response.Write(myInt+”);/第三种方法Int32.TryParse(myString,out myInt
5、);Response.Write(myInt+”);8string myString=null;int myInt=0;/第一种方法myInt=Convert.ToInt32(myString);Response.Write(myInt+”);/第二种方法myInt=Int32.Parse(myString);Response.Write(myInt+”);/第三种方法Int32.TryParse(myString,out myInt);Response.Write(myInt+”);结果:ToInt32不抛出异常,而是返回0,Int32.Parse会抛出异常,Int32.TryParse不抛
6、出异常,会返回true或false来说明解析是否成功从性能上讲:Int32.TryParse优于Int32.Parse,都优于Convert.ToInt3293.23.2使用作用域使用作用域一个变量的作用域或范围,是指该变量能发挥作用的一个程序区域方法也有作用域,一个标识符的作用域始于声明该标识符的那个位置3.2.1 3.2.1 定义局部作用域定义局部作用域方法的作用域: 在方法中声明的变量都具有该方法的作用域一旦方法结束,它们也会随之消失它们只能由该方法内部的代码访问,称之为局部变量class Examplevoid firstMethod()int myVar;.void anotherM
7、ethod()myVar = 42; / error variable not in scope.3.2.2 3.2.2 定义类的作用域定义类的作用域在类的主体中(但不能在方法中)声明的任何变量都具有那个类的作用域C#中,使用字段字段表示在类中定义的变量class Examplevoid firstMethod()myField = 42; / ok.void anotherMethod()myField+; / ok.int myField = 0;注意:在方法中,一个变量必须先声明再使用字段可以在类中的任何位置定义(在编译器生成的IL中,字段实际还是先声明并初始化,然后再使用的)3.2.3
8、 3.2.3 重载方法重载方法如果两个标识符同名,而且是在同一个作用域中定义的,就可以说它们被重载如果需要针对不同的数据类型执行相同的操作,重载就是一项十分重要的技术如果一个方法有多个不同的实现,而且每个实现都有不同的参数集,就可以考虑重载该方法static void Main()Console.WriteLine(The answer is );Console.WriteLine(42);方法信号:方法的名字、数量、类型和参数序列组成了一个方法的信号方法信号不包括返回类型public double Sum (double a, double b)public int Sum (double
9、a, double b)public void Sum (double a, double b) 构建方法时忽略关键字paramspublic double Sum (params double numbers)public double Sum (double numbers) 不包括形式参数的名字public int Sum (double x, double y)public int Sum (double a, double b) 15重载方法和隐式转换重载方法和隐式转换 若方法调用中的参数与对应的形式参数不存在类型匹配,对于这样的每个参数,编译器都将尽力寻找从参数类型到形式参数间的隐
10、式转换路径。转换规则1:根据转换层次,选择与参数类型最接近者。转换规则2:void DoIt (float x)void DoIt (decimal x) sbyte mySbyte = 10;DoIt (mySbyte) 只有不必经过long或ulong类型,编译器才可解决此难题,即为:float、double或decimal16转换规则3:当编译器正沿隐式转换路径搜索匹配的方法信号,如果找到了两个同样适合的信号,一个包含一个有符号整数类型,另一个包含一个无符号整数类型,它将选择有符号整数类型。17慎用方法重载慎用方法重载01: using System;03: class Book04:
11、05: private string title;06: private uint numberOfPages;07: private double weight;09: public void Set(string newTitle)10: 11: title = newTitle;12: 14: public void Set(uint newNumberOfPages)15: 16: numberOfPages = newNumberOfPages;17: 19: public void Set(double newWeight)20: 21: weight = newWeight;22
12、: 24: public void Set(string newTitle, uint newNumberOfPages, double newWeight)25: 26: title = newTitle;27: numberOfPages = newNumberOfPages;28: weight = newWeight;29: 1831: public void Set(string newTitle, double newWeight, uint newNumberOfPages)32: 33: title = newTitle;34: numberOfPages = newNumbe
13、rOfPages;35: weight = newWeight;36: 38: public void PrintDetails ()39: 40: Console.WriteLine(nTitle: + title);41: Console.WriteLine(Number of pages: + numberOfPages);42: Console.WriteLine(Weight: 0 pounds, weight);43: 44: 46: class VirtualBookshop47: 48: public static void Main()49: 50: Book myBook
14、= new Book();52: myBook.Set(“C#入门经典入门经典);53: myBook.Set(1.3);54: myBook.Set(300);55: myBook.PrintDetails();57: myBook.Set(“计算机网络计算机网络, 1.1, 400);58: myBook.PrintDetails();59: myBook.Set(“数据库系统概论数据库系统概论, 2000, 10.0);60: myBook.PrintDetails();62: myBook.Set(11);63: myBook.PrintDetails();65: /myBook.Se
15、t(“管理信息系统管理信息系统, 8070, 3);66: 67: 19限制重载方法的数量,让方法的名字反映他们的实际动作public void SetTitle(string newTitle)public void SetNumberOfPages (uint newNumberOfPages)public void SetWeight (double newWeigth) 将多赋值方法的数量限制为一个public void SetAll (string newTitle, uint newNumberOfPages, double newWeight) 203.4 3.4 使用可选参数使
16、用可选参数面向对象的语言一般都会支持方法的重载功能但是一些开发人员使用的语言和技术可能并不遵守这些规范C#和其他面向.NET Framework的语言一项关键的能力就是能够与使用其他技术开发的应用程序和组件进行互操作Microsoft Windows使用的一项主要技术是组件对象模型COM技术不支持重载方法,但允许方法获取可选参数为了更好的与COM集成,C#也提供了对可选参数的支持当参数类型差异不足以使编译器区分两个不同的实现,造成无法使用重载技术,则可选参数能提供一个简单好用的解决方案例如:public void DoWorkWithData(int intData, float floatD
17、ata, int moreIntData) .该方法提供三个参数,若你想只提供两个参数,例如:public void DoWorkWithData(int intData, float floatData) .如下调用int arg1 = 99;float arg2 = 100.0F;int arg3 = 101;DoWorkWithData(arg1, arg2, arg3); / Call overload with three parametersDoWorkWithData(arg1, arg2); / Call overload with two parameters若要实现该方法的
18、另外两个版本,她们只用于获取第一个和第二个参数,那么可能草率的写出以下重载版本public void DoWorkWithData(int intData) .public void DoWorkWithData(int moreIntData) .3.4.1 3.4.1 定义可选参数定义可选参数为了指定参数是可选的,可以在定义方法时为该参数提供一个默认值默认值是使用赋值操作符来赋予的void optMethod(int first, double second = 0.0, string third = Hello) .注意:所有可选参数只能放在必须的参数之后调用时,要提供必须的实参可以省略
19、对应的可选参数的实参例如:optMethod(99, 123.45, World); / Arguments provided for all three parametersoptMethod(100, 54.321); / Arguments provided for 1st two parameters only3.4.2 3.4.2 传递命名参数传递命名参数C#默认根据每个实参在方法调用中的位置判断它们对应于哪个形参C#还允许按照名称指定参数,利用这个功能,就可以按照不同的顺序传递实参了为了将一个实参作为命名参数来传递,必须输入参数名,一个冒号,然后是传递的值例如:optMethod(
20、first : 99, second : 123.45, third : World);optMethod(first : 100, second : 54.321);改变顺序的传递:optMethod(third : World, second : 123.45, first : 99);optMethod(second : 54.321, first : 100);该功能还允许省略实参,例如:optMethod(first : 99, third : World);还可以兼按位置和名称来指定实参,但是必须先指定好所有按照位置的实参,再指定命名的实参,例如:optMethod(99, thi
21、rd : World); / First argument is positional3.4.3 3.4.3 消除可选参数和命名参数的歧义消除可选参数和命名参数的歧义使用可选参数和命名参数可能造成代码的歧义例如:void optMethod(int first, double second = 0.0, string third = Hello) .void optMethod(int first, double second = 1.0, string third = Goodbye, int fourth = 100 ) .该代码符合方法重载规则,编译器能够进行区分,因为两者的参数列表不同调用:optMethod(1, 2.5. World);调用:optMethod(1, fourth : 101);但是,如下调用:optMethod(1, 2.5);optMethod(1, third : World);optMethod(1);optMethod(second : 2.5, first : 1);本章结束本章结束28结束结束