第5讲方法1
现在来讲一下C#中的方法。
PPT:方法是包含一系列语句的代码块。它实现了一定的功能,并拥有一个便于识别的名称,也便于在程序中调用。
声明方法的语法
成员访问修饰符 返回值 方法名称(参数列表)
{
//方法的内容
}
声明一个方法首先要定义它的访问修饰符,比如是Public,还是Private等等。接下来要写这个方法的返回值的类型,如果没有返回值则用void来代替。接下来是方法的名称由自己定义,方法的名称不可重复,大小写视为不同,这个不可重复是指的同一个类,或者是说同一个命名空间之下,如果处于不同命名空间之下方法的名称是可以相同的。接下来在小括号中编写参数列表,参数可以没有,也可以是多个,参数的类型可以是一个类型,也可以是多种类型,多个参数之间用逗号分隔。最后是方法的内容,方法的内容包含在{}之中,下面我们来简单编写一个方法。
我们新建一个文件Method.cs:
接着我们进行编译:

屏幕上打印了一行字,没有问题。下面呢,我们把上的输出语句声明成一个方法。
我们编译程序结果也是一样的,我们是调用MyMothod这个方法在屏幕上打印了"this is a Method"这些字。
好,下面我们写一个如何带返回值的方法,代码如下:
我们执行编译效果如下:

我们看屏幕上打印出了当前的时间。下面我们演示一下带参数的方法,代码如下:
我们执行编译代码,并且在分别输入join,Tom,aaa和end,来检验我们程序的效果,如图:

从刚才的运行过程我们可以看出,程序不断的等待用户输入,并不断的调用MyMethod方法,而且打印出你所输入的字符串。
下面我们演示一下带多个参数的方法,代码如下:
执行编译代码,如图:

我们看屏幕上打印出i+k=8,也就是5加3等于8,得到了正确的结果。
下面我们来讲一下共享变量。C#语言是一门完全面向对象的语言,它屏弃了全局变量,但是如果两个以上的方法要共享一个变量则要将此变量声明在类(Class)阶层。和局部变量不同的地方在于,类级别变量的生命周期是在此类加载到内存时就会自动地分配内存空间,要等到此对象被Common Language Runtime的垃圾回收器(Garbage Collector)回收时,才会释放掉所占用的内存空间。
以前我们在使用C++编程时,需要手工的编写代码去释放我们内存空间中编写的类或方法,而在C#中就不再需要做这样的工作了。C#中的垃圾回收不在我们的程序中进行,而是由.NET统一在适当的时候进行。这大大减少了写出不合理代码的可能性,也增加了编程的效率,使得我们可以更加专注于程序的逻辑,下面我们来演示一下如何共享变量。
我们改一下刚才的代码,代码如下:
我们看看静态变量i是否在2个实例a和b之间共享,编译执行代码:

屏幕上显示的结果是2,也就是说add()这个函数被调用了2次,而这次调用是通过2个不同实例来调用的。换句话说,不管类A创建了多少个实例,所有的实例始终共享这个i。这样通过static这个关键字声明一个静态变量就可以实现全局函数的功能了。
现在我们来做个实验,删除static这个关键字,我们看看程序会不会报错~会,编译不通过,错误原因就是A.i。也就是说非静态的变量不能直接使用名称来访问,但是我们可以使用实例来访问。假如改成b.i通过实例b来访问i。代码中同样调用了2次add()方法,我们进行编译看执行的结果却是1。也就是说a和b这2个实例里面各有一个i的副本,而b实例中的i只增加了一次,所以结果是1。
PPT:方法是包含一系列语句的代码块。它实现了一定的功能,并拥有一个便于识别的名称,也便于在程序中调用。
声明方法的语法
成员访问修饰符 返回值 方法名称(参数列表)
{
//方法的内容
}
声明一个方法首先要定义它的访问修饰符,比如是Public,还是Private等等。接下来要写这个方法的返回值的类型,如果没有返回值则用void来代替。接下来是方法的名称由自己定义,方法的名称不可重复,大小写视为不同,这个不可重复是指的同一个类,或者是说同一个命名空间之下,如果处于不同命名空间之下方法的名称是可以相同的。接下来在小括号中编写参数列表,参数可以没有,也可以是多个,参数的类型可以是一个类型,也可以是多种类型,多个参数之间用逗号分隔。最后是方法的内容,方法的内容包含在{}之中,下面我们来简单编写一个方法。
我们新建一个文件Method.cs:
- using System;
- //声明一个类
- class Method
- {
- static void Main()
- {
- //输出一行
- Console.WriteLine("this is a Method");
- }
- }

屏幕上打印了一行字,没有问题。下面呢,我们把上的输出语句声明成一个方法。
- using System;
- //声明一个类
- class Method
- {
- static void Main()
- {
- //调用方法,直接打方法的名称加括号就可以了
- MyMothod();
- }
- //首先是成员访问修饰符public和static
- //public表示它是一个公用的方法
- //static表示它是一个静态的方法
- //成员的返回值,没有返回值则是void代替
- //方法的名称叫MyMothod
- //后面括号之间没有任何参数,表明这个方法没有参数
- public static void MyMothod()
- {
- //作为方法体,输出一行
- Console.WriteLine("this is a Method");
- }
- }
好,下面我们写一个如何带返回值的方法,代码如下:
- using System;
- class Method
- {
- static void Main()
- {
- //打印当前的时间
- Console.WriteLine("Now time is {0}",MyMothod());
- }
- //返回值类型是DateTime
- public static DateTime MyMothod()
- {
- //直接返回当前的时间
- //Now后面没有括号,说明它是属性而不是方法
- return DateTime.Now;
- }
- }

我们看屏幕上打印出了当前的时间。下面我们演示一下带参数的方法,代码如下:
- using System;
- class Method
- {
- static void Main()
- {
- //声明一个变量
- string TempName = "";
- //当输入end字符,程序则终止
- while (TempName != "end")
- {
- //等待用户输入
- TempName = Console.ReadLine();
- //调用MyMothod方法并以TempName作为参数
- MyMothod(TempName);
- }
- }
- //声明一个参数AName,参数的类型是字符串类型
- public static void MyMothod(string AName)
- {
- //这个方法在屏幕上打印一行字
- //打印的内容中使用了参数AName
- //这就意味着打印的内容是可以改变的
- ///n是个换行符
- Console.WriteLine("The Name is " + AName + "/n");
- }
- }

从刚才的运行过程我们可以看出,程序不断的等待用户输入,并不断的调用MyMethod方法,而且打印出你所输入的字符串。
下面我们演示一下带多个参数的方法,代码如下:
- using System;
- class Method
- {
- static void Main()
- {
- //声明两个变量
- int i = 5;
- int k = 3;
- //将i,k作为参数传递到add方法中
- //打印出两数之和
- Console.WriteLine("i + k =" + add(i, k));
- }
- //声明一个方法add,返回值类型是整数型
- //带了两个参数整数i和整数k,用逗号隔开
- public static int add(int i, int k)
- {
- //返回值是两个参数之和
- return i + k;
- }
- }

我们看屏幕上打印出i+k=8,也就是5加3等于8,得到了正确的结果。
下面我们来讲一下共享变量。C#语言是一门完全面向对象的语言,它屏弃了全局变量,但是如果两个以上的方法要共享一个变量则要将此变量声明在类(Class)阶层。和局部变量不同的地方在于,类级别变量的生命周期是在此类加载到内存时就会自动地分配内存空间,要等到此对象被Common Language Runtime的垃圾回收器(Garbage Collector)回收时,才会释放掉所占用的内存空间。
以前我们在使用C++编程时,需要手工的编写代码去释放我们内存空间中编写的类或方法,而在C#中就不再需要做这样的工作了。C#中的垃圾回收不在我们的程序中进行,而是由.NET统一在适当的时候进行。这大大减少了写出不合理代码的可能性,也增加了编程的效率,使得我们可以更加专注于程序的逻辑,下面我们来演示一下如何共享变量。
我们改一下刚才的代码,代码如下:
- using System;
- class Method
- {
- //声明一个类A
- class A
- {
- //声明一个静态的变量
- //这个i意味着当类A被分配内存的时候,i就已经存在了并初始化
- //不管这个类A创建了多个个实例,所有的实例共享变量i
- public static int i = 0;
- //操作i,方法add作用是给i加1
- public void add()
- {
- i = i + 1;
- }
- }
- static void Main()
- {
- //创建类A实例a
- A a = new A();
- a.add();
- //创建类A实例b
- A b = new A();
- b.add();
- //打印出类A中i的结果
- //访问静态变量可以直接使用类的名称作为前缀
- Console.WriteLine(A.i);
- }
- }

屏幕上显示的结果是2,也就是说add()这个函数被调用了2次,而这次调用是通过2个不同实例来调用的。换句话说,不管类A创建了多少个实例,所有的实例始终共享这个i。这样通过static这个关键字声明一个静态变量就可以实现全局函数的功能了。
现在我们来做个实验,删除static这个关键字,我们看看程序会不会报错~会,编译不通过,错误原因就是A.i。也就是说非静态的变量不能直接使用名称来访问,但是我们可以使用实例来访问。假如改成b.i通过实例b来访问i。代码中同样调用了2次add()方法,我们进行编译看执行的结果却是1。也就是说a和b这2个实例里面各有一个i的副本,而b实例中的i只增加了一次,所以结果是1。