5.2 方法 既然对象能正确地初始化和结束,所剩下来的就是往类中增加功能。在大多数情况下,功能的主要部分在方法中能得到实现。你早已见过静态方法的使用,但是,这些是类型(类)的部分,不是实例(对象)。 为了让你迅速入门,我把这些方法的烦琐问题安排为三节: 。方法参数 。改写方法 。方法屏蔽 5.2.1 方法参数 因方法要处理更改数值,你多多少少要传递值给方法,并从方法获得返回值。以下三个部分涉及到由传递值和为调用者获取返回结果所引起的问题。 。输入参数 。引用参数 。输出参数 5.2.1.1 输入参数 你早已在例子中见过的一个参数就是输入参数。你用一个输入参数通过值传递一个变量给一个方法——方法的变量被调用者传递进来的值的一个拷贝初始化。清单5.1 示范输入参数的使用。 清单 5.1 通过值传递参数
1: using System; 2: 3: public class SquareSample 4: { 5: public int CalcSquare(int nSideLength) 6: { 7: return nSideLength*nSideLength; 8: } 9: } 10: 11: class SquareApp 12: { 13: public static void Main() 14: { 15: SquareSample sq = new SquareSample(); 16: Console.WriteLine(sq.CalcSquare(25).ToString()); 17: } 18: } 因为我传递值而不是引用给一个变量,所以当调用方法时(见第16行),可以使用一个常量表达式(25)。整型结果被传回给调用者作为返回值,它没有存到中间变量就被立即显示到屏幕上 。 输入参数按C/C++程序员早已习惯的工作方式工作。如果你来自VB,请注意没有能被编译器处理的隐式ByVal或ByRef——如果没有设定,参数总是用值传递。 这点似乎与我前面所陈述的有冲突:对于一些变量类型,用值传递实际上意味着用引用传递。 迷惑吗? 一点背景知识也不需要:COM中的东西就是接口,每一个类可以拥有一个或多个接口。一个接口只不过是一组函数指针,它不包含数据。重复该数组会浪费很多内存资源;所以,仅开始地址被拷贝给方法,它作为调用者,仍然指向接口的相同指针。那就是为什么对象用值传递一个引用。 5.2.1.2 引用参数 尽管可以利用输入参数和返回值建立很多方法,但你一想到要传递值并原地修改它(也就是在相同的内存位置),就没有那么好运了。这里用引用参数就很方便。 void myMethod(ref int nInOut) 因为你传递了一个变量给该方法(不仅仅是它的值),变量必须被初始化。否则,编译器会报警。 清单 5.2 显示如何用一个引用参数建立一个方法。 清单 5.2 通过引用传递参数 1: // class SquareSample 2: using System; 3: 4: public class SquareSample 5: { 6: public void CalcSquare(ref int nOne4All) 7: { 8: nOne4All *= nOne4All; 9: } 10: } 11: 12: class SquareApp 13: { 14: public static void Main() 15: { 16: SquareSample sq = new SquareSample(); 17: 18: int nSquaredRef = 20; // 一定要初始化 19: sq.CalcSquare(ref nSquaredRef); 20: Console.WriteLine(nSquaredRef.ToString()); 21: } 22: } 正如所看到的,所有你要做的就是给定义和调用都加上ref限定符。因为变量通过引用传递,你可以用它来计算出结果并传回该结果。但是,在现实的应用程序中,我强烈建议要用两个变量,一个输入参数和一个引用参数。 5.2.1.3 输出参数 传递参数的第三种选择就是把它设作一个输出参数。正如该名字所暗示,一个输出参数仅用于从方法传递回一个结果。它和引用参数的另一个区别在于:调用者不必先初始化变量才调用方法。这显示在清单5.3中。 清单 5.3 定义一个输出参数 1: using System; 2: 3: public class SquareSample 4: { 5: public void CalcSquare(int nSideLength, out int nSquared) 6: { 7: nSquared = nSideLength * nSideLength; 8: } 9: } 10: 11: class SquareApp 12: { 13: public static void Main() 14: { 15: SquareSample sq = new SquareSample(); 16: 17: int nSquared; // 不必初始化 18: sq.CalcSquare(15, out nSquared); 19: Console.WriteLine(nSquared.ToString()); 20: } 21: }  
2/2 首页 上一页 1 2 |