2.在Main()方法中,我们调用getChoice()来读取用户的输入,并且把字符串放到myChoice变量中。
之后,把myChoice变量作为makeDecision()函数的实在参数。在实现makeDecision()方法时,注意其形式参数为字符串myChoice。需要再次说明的是:这是个新的myChoice变量,不同于调用者的实在参数,仅仅是适用于本方法的局部变量。 因为makeDecision()方法的myChoice参数没有任何其他修饰符,故认为它是"值"参,即实在参数的值被拷贝到栈中,故作为值参的变量是局部的,任何对局部变量值的改变并不影响到调用者的实在参数的值。换句话说,值参仅仅是来自调用者的输入。
3.makeDecision()方法中的switch语句完成如下功能:
在每种情形下,都调用相应的方法。这些方法的调用不同于Main()方法。除了使用"mp" 引用,它们还使用了"this"关键字。"this"是对当前对象的引用。由于makeDecision()方法不是静态方法,当前对象已经被实例化,所以可以使用"this"引用来调用同一实例中的方法。
4.addAddress()方法用到了"ref"参数,即引用可作为参数来传递,即该引用被拷贝到栈中,其引用的对象同调用者的实参所引用的对象是同一个。
这意味着:任何对局部引用的对象的改变也就是对调用者所引用的对象的改变。你可以想象一下,这就相当于输入/输出参数。
5.modifyAddress()中有一个输出参数。
输出参数仅仅传递给被调用函数。一旦调用该方法时,在栈中的仅有的一个引用未被赋值,因为根据赋值的确定性原则,在该变量没有被赋值之前,就不能使用该变量。modifyAddress()方法的第一行作为注释,说明了这一点。你可以试着去掉注释符,编译一下程序,看看结果如何。一旦该变量被赋了值,在程序返回之后,输出参数就被拷贝到调用者的参数中。所以,在方法返回之前,必须给输出参数赋值。
小结
C# 语言的一个很有用途的参数类型是数组参数,它须是一维或多维的数组。在makeDecision()方法中,我们传递了用四个逗号隔开的字符串参数。参数的个数是变量。在viewAddresses()方法中,使用了foreach循环,逐一输出这些字符串。数组参数仅是一种输入性质的参数,任何对数组参数值的改变仅仅影响到局部的副本值。
概括地讲,你现在已经理解了方法的组织结构。你还了解了方法的实现可以采用的四种参数类型及其格式。 一旦你使用实例方法,就必须实例化该对象,静态方法则不同,后者可以在任何时候被调用。另外,你也了解了"this"引用是如何调用实例方法的。