方法(Method)

方法是一段带有名称的代码块。你可以在程序其他位置通过调用方法名执行这段代码,也能向方法传入数据、并接收方法返回的输出数据。

方法的构成

正如前面说的,方法是类的函数成员。

方法其实就是函数,当一个函数属于类里面的函数的时候,就换了一个名字叫方法。在C语言中,都叫函数。

方法由两大核心部分组成:方法头(方法声明头)方法体

  1. 方法头:定义方法全部特征,包含以下信息:
    • 方法是否有返回值,若有则指定返回值类型
    • 方法名称
    • 可传入 / 传出的数据类型,以及数据的处理规则
  2. 方法体:由可执行代码语句序列构成。程序执行会从方法体内第一条语句开始,按顺序逐条执行。

看例子

    string Introduce(string name,int age)
    {
        string words = $"hello my name is {name},i'm {age} years old";
        Console.WriteLine(words);
        return words;
    }Code language: C# (cs)

方法头: string Introduce(string name,int age)

  • string :返回值类型 是字符串
  • Introduce:方法名
  • (string name,int age):参数列表,这两个也是一个变量,是接收外面传进来的名字和年龄值,然后在函数体中就可以使用了
以上是方法的各个部分的介绍

如何调用这个方法?

因为方法是在Program的,和Main方法同在一个类中,但是Main方法是static,静态的,静态的方法,是不能直接调用非静态的方法的,如果要调用Introduce,则需要先创建一个Program的实例,然后再调用。

class Program
{
    static void Main()
    {
        Program program = new Program();
        program.Introduce("John", 30);
    }

    string Introduce(string name,int age)
    {
        string words = $"hello my name is {name},i'm {age} years old";
        Console.WriteLine(words);
        return words;
    }
}Code language: C# (cs)

如下这样直接调用,会报错

正确的做法是在Main函数中先new一个Program的实例,然后通过实例来调用Introduce

Program program = new Program();//√
program.Introduce("John", 30);Code language: C# (cs)

方法体

方法体内包含0条或者多条执行语句。

方法体是一个代码块(大括号包裹的一组语句),代码块内可包含以下内容:

  • 局部变量
  • 流程控制结构(循环、分支等)
  • 方法调用,调用其他方法
  • 嵌套子代码块
  • 内部局部函数(定义在方法内的子方法)[后面学习]
class Program
{
    static void Main()
    {
        int age = 3; // 局部变量,初始值3
        while (age > 0) // 流程控制结构
        {
            --age;
            Introduce("Tom", age); // 方法调用
        }

        {
            //嵌套的子代码块
        }
    }

    static string Introduce(string name,int age)
    {
        string words = $"hello my name is {name},i'm {age} years old";
        Console.WriteLine(words);
        return words;
    }
}
Code language: JavaScript (javascript)

上面代码,把Introduce函数也改为了static,看前面多了一个static,这样它就变成了静态函数了,然后在Main函数中就可以直接调用了,不在需要通过实例来调用。


局部变量(Local Variables)

和前面说到实例字段一样,局部变量用于存储数据;但实例字段一般保存对象状态,局部变量仅用于临时、单次计算的数据存储。

当局部变量所在的方法执行结束,局部变量就会出栈,如果是值类型,就直接销毁,如果是引用类型,就会在某个时间被垃圾回收器销毁。

1. 局部变量声明语法
类型 变量名 = 初始值;
  • 变量名:自定义标识符
  • = 初始值:可选初始化器,用于给变量赋初始值

2. 局部变量核心规则

  1. 生命周期与作用域:仅存在于定义它的代码块,以及该块内所有嵌套子块
    • 变量在声明的代码行才创建生效
    • 代码块执行完毕后,变量直接销毁失效
  2. 声明位置无限制:可写在方法体内任意位置,但必须先声明,后使用
    static void Main()
    {
        int age = 3; //局部变量
        Phone p = new Phone(); //自定义类型的局部变量

        {
            int one = 1; //属于子代码块的局部变量
            bool two = false;
        }

        double d = 0;
    }Code language: JavaScript (javascript)
上图的子代码块执行结束后,one和two两个局部变量就会出栈销毁

实例字段 vs 局部变量

实例字段局部变量
生命周期对象实例创建时生成;
对象无法访问时销毁
声明代码行生效;
所属代码块执行完毕销毁
默认初始化编译器自动赋予该类型默认值无自动初始化;
未赋值就使用会直接编译报错
内存存储全部存放在堆(Heap),
无论值类型 / 引用类型
值类型:栈 (Stack);
引用类型:引用存栈,对象数据存堆

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注