本节课向你介绍C#的方法,其目的是:
1.
了解方法的结构格式
2.
了解静态和实例方法之间的区别
3.
学会实例对象的使用
4.
学会如何调用实例化的对象
5.
学会方法的四种参数类型的使用
6.
学会使用"this"引用

   
以往,对于每个程序来说,所有的工作都在Main()方法中实现。这对于功能简单的程序是合适的,因为仅仅用来学习一些概念。有个更好的方法来组织你的程序,那就是使用方法。方法是很有用的,因为方法可以让你在不同的单元中分开设计你的逻辑模块。

方法的结构格式如下:

属性 修饰符 返回值类型 方法名(参数) { 语句 }

我们将在后面的课程中,讨论属性和修饰符。方法的返回值可以是任何一种C#的数据类型,该返回值可以赋给变量,以便在程序的后面部分使用。方法名是唯一,可以被程序调用。为使得你的代码变得更容易理解和记忆,方法的取名可以同所要进行的操作联系起来。你可以传递数据给方法,也可以从方法中返回数据。它们由大括号包围起来。大括号中的语句实现了方法的功能。

1.清单5-1. 一个简单的方法: OneMethod.cs

 

using System;
class OneMethod {
public static void Main() {
   string myChoice;
   OneMethod om = new OneMethod();
  do {
     myChoice = om.getChoice();
// Make a decision based on the user's choice
switch(myChoice) {
case "A":
case "a":
Console.WriteLine("You wish to add an address.");
break;
case "D":
case "d":
Console.WriteLine("You wish to delete an address.");
break;
case "M":
case "m":
Console.WriteLine("You wish to modify an address.");
break;
case "V":
case "v":
Console.WriteLine("You wish to view the address list.");
break;
case "Q":
case "q":
Console.WriteLine("Bye.");
break;
default:
Console.WriteLine("{0} is not a valid choice", myChoice);

break;

}

// Pause to allow the user to see the results
Console.Write("Press any key to continue...");
Console.ReadLine();
Console.WriteLine();
} while (myChoice != "Q" && myChoice != "q"); // Keep going until the user wants to quit
}

string getChoice() {
string myChoice;
// Print A Menu
Console.WriteLine("My Address Book\n");
Console.WriteLine("A - Add New Address");
Console.WriteLine("D - Delete Address");
Console.WriteLine("M - Modify Address");
Console.WriteLine("V - View Addresses");
Console.WriteLine("Q - Quit\n");
Console.WriteLine("Choice (A,D,M,V,or Q): ");

// Retrieve the user's choice
myChoice = Console.ReadLine();
return myChoice;
  }
}

 

说明

1.清单5-1中的程序类似于第四课中的DoLoop程序。区别在于:前一课中的程序打印出菜单内容,并在Main()方法中接受用户的输入,而本课中,该功能用一个名为getChoice()的方法实现,该方法的返回值类型是个字符串类型。在main方法中,在 switch语句中用到了该串。方法"getChoice"实现了调用时所完成的工作。方法名后面的括号内是空的,因为调用getChoice()方法时,不需要传递任何数据。

2.在方法块中,我们首先定义了变量"myChoice"虽然它与 Main()方法中的"myChoice"变量同名同类型, 但它们是不同的两个变量,因为局部变量仅仅在其定义的块内可见。换句话说, getChoice()方法中的"myChoice" Main()方法中的"myChoice"变量没有丝毫联系。getChoice()方法打印出一个菜单到控制台,并读取用户的输入。"return" 语句把"myChoice"变量值返回给Main()方法中的调用者getChoice()。注意: "return"语句返回类型同该方法中定义的返回值类型相同,本例中,该返回值是个字符串。

3.
Main()方法中,在使用getChoice()之前,实例化了一个新的"OneMethod"对象。这是因为:我们没有指明一个"静态"修饰符。(注意:Main()函数带有"静态"修饰符)getChoice()就成为一个实例的方法。 实例方法和静态方法的区别是:前者可以创建多个类的实例,每个实例有自己的单独的getChoice()方法。而一旦方法是静态的,就不存在方法的实例, 你只能调用该静态方法的一个实现。

所以,正如前面所讲的,因为getChoice()并不是静态的,所以,我们必须实例化一个新对象来使用它。这是通过定义"OneMethod om = new OneMethod()"来进行的。在等号的左边,是对象引用"om",其类型是OneMethod"om"是个对象的引用,这点很重要,"om"并不是对象自身,它是个引用OneMethod类型对象的变量。 在等号的右边,把新创建的OneMethod对象赋给引用"om"。 关键字"new"是个在堆上创建对象的新实例的C#运算符。此处完成的工作是: 在堆上创建一个新的OneMethod实例,并把它赋给om引用。一旦有了om引用的OneMethod对象实例,就可以通过om引用来对实例进行处理。

方法,域和其他类成员可以通过"." ()运算符进行访问,标识和操纵。一旦需要调用方法getChoice(),就通过om引用,并使用点运算符"om.getChoice()"来进行。 getChoice() 块中的语句执行完毕之后即返回。为了捕捉到getChoice()的返回值,我们使用了赋值运算符"="。 返回串放到了Main()函数的局部变量 myChoice中,从那里,程序的其余部分按照前面课程中介绍的方式正常执行。

 

 

 

 

2.清单5-2. 方法参数:cs_ref.cs

 

using System;

public class MyClass {

   public static void TestRef(ref char i)

{

// Console.WriteLine(i); //错误 i 尚未被初始化

   i = 'b';

}

 

public static void TestNoRef( char i)

{

   i = 'c';

}

public static void Main()

{

    char i='a';//变量必须初始化

    TestRef(ref i);

    Console.WriteLine(i);

 

    TestNoRef(i);

    Console.WriteLine(i);

 }

}

 

 

说明

//cs_out.cs

using System;

public class MyClass

{

    public static int TestOut(out char i)

    {

        //Console.WriteLine(i); 错误 i未被赋值

        i = 'b';

        return -1;

    }

    public static void usparas(params int[] list)

    {

        for (int i = 0; i < list.Length; i++)

            Console.WriteLine(list[i]);

        Console.WriteLine();

    }

 

    public static void Main()

{

       char i;//变量可以不初始化

       Console.WriteLine(TestOut( out i));

       Console.WriteLine(i);

 

       Console.WriteLine("===============");

      int[] myarray = new int[3]{10,11,12};

      usparas(myarray);

}

}

 

1.C#可以处理四种类型的参数:out(输出,当程序转至调用方法时,在方法中对参数所做的任何改动都将传递给该变量,若使用out参数,必须标识,可以不初始化该变量),ref(当程序转至调用方法时,在方法中对参数所做的任何改动都将传递给该变量,若使用ref参数,必须标识,并且初始化该变量),params(该关键字用于指定在参数数目可变时带有参数的方法参数,声明该关键字后,不允许再引入其它参数,并且在该方法声明中只能使用一次)和value(值)。


2
TestRef方法用到了"ref"参数,即引用可作为参数来传递,即该引用被拷贝到栈中,其引用的对象同调用者的实参所引用的对象是同一个。这意味着:任何对局部引用的对象的改变也就是对调用者所引用的对象的改变。你可以想象一下,这就相当于输入/输出参数。

3
TestOut中有一个输出参数。一旦调用该方法时,在栈中的仅有的一个引用未被赋值,因为根据赋值的确定性原则,在该变量没有被赋值之前,就不能使用该变量。该方法的注释,说明了这一点。你可以试着去掉注释符,编译一下程序,看看结果如何。一旦该变量被赋了值,在程序返回之后,输出参数就被拷贝到调用者的参数中。所以,在方法返回之前,必须给输出参数赋值。

小结
C#
概括地讲,你现在已经理解了方法的组织结构。你还了解了方法的实现可以采用的四种参数类型及其格式。 一旦你使用实例方法,就必须实例化该对象,静态方法则不同,后者可以在任何时候被调用。另外,你也了解了"this"引用是如何调用实例方法的。

posted on 2009-10-07 20:23  qqhfeng16  阅读(501)  评论(0)    收藏  举报