C# 方法(栈帧)

本章内容:

方法的结构

方法体内部的代码执行

局部变量

局部常量

控制流

方法调用

返回值

返回语句和void方法

局部函数

参数

值参数

引用参数

引用类型作为值参数和引用参数

输出参数

参数数组

参数类型总结

方法重载

命名参数

可选参数

栈帧

递归

栈帧

至此,我们已经知道了局部变量和参数是位于栈上的,下面深入探讨一下其组织。

在调用方法的时候,内存从栈的顶部开始分配,保存和方法关联的一些数据项。这块内存叫

作方法的栈帧(stackframe)。

  • 栈帧包含的内存保存如下内容。
    • 返回地址,也就是在方法退出的时候继续执行的位置。
    • 分配内存的参数,也就是方法的值参数,还可能是参数数组(如果有的话)。
    • 到和方法调用相关的其他管理数据项。
  • 在方法调用时,整个栈帧都会压入栈。
  • 在方法退出的时候,整个栈帧都会从栈上弹出。弹出栈帧有的时候也叫作栈展开(unwind)。

例如,如下代码声明了3个方法。Main调用MethodA,MethodA又调用MedhodB,创建了3个

栈帧。在方法退出的时候,栈展开。

复制代码
class Program
{
    static void MethodA(int par1,int par2)
    {
        Console.WriteLine($"Enter MethodA:{par1},{par2}");
        MethodB(11,18);
        Console.WriteLine("Exit MethodA");
    }

    static void MethodB(int par1,int par2)
    {
        Console.WriteLine($"Enter MethodB:{par1},{par2}");
        Console.WriteLine("Exit MethodB");
    }

    static void Main()
    {
        Console.WriteLine("Enter Main");
        MethodA(15,30);
        Console.WriteLine("Exit Main");
    }
}

递归

除了调用其他方法,方法也可以调用自身。这叫作递归。

递归会产生很优雅的代码,比如下面计算阶乘数的方法就是如此。注意在本例的方法内部,

方法使用比输入参数小1的实参调用自身。

调用方法自身的机制和调用其他方法其实是完全一样的,都是为每一次方法调用把新的栈帧

压入栈顶。

例如,在下面的代码中,Count方法使用比输人参数小1的值调用自身,然后打印输人的参

数。随着递归越来越深,栈也越来越大。

相关推荐
我的xiaodoujiao26 分钟前
Django 基础知识详细图文教程 4-Django 视图定义与使用
开发语言·数据库·后端·测试工具·django·sqlite
l1t27 分钟前
DeepSeek总结的DuckDB在 CI 中为 release 和 glibc CLI 构建启用 LTO - #24225
开发语言·数据库·ci/cd·duckdb
whitelbwwww28 分钟前
c++运行RKNN
开发语言·c++
2601_9620702335 分钟前
差异基因富集分析(R语言——GO&KEGG&GSEA)
开发语言·golang·r语言
布莱克60537 分钟前
栈(Stack)详解:定义、作用、应用场景及与队列的区别(附 C/C++ 代码)
c语言·开发语言·c++·
zmzb010338 分钟前
C++课后习题训练记录Day203
开发语言·c++
zzzll11111 小时前
LangChain4j:Java 生态的 AI 应用开发利器
java·开发语言·人工智能
呆呆敲代码的小Y1 小时前
【游戏开发】Lua 与 C# 交互原理解析
c#·lua·交互·热更新·lua与c#交互·游戏热更新
JAI科研1 小时前
Deepseek Agent Harness教程(七) | Deepseek Harness不是一个内核加一堆插件
开发语言·人工智能·深度学习·算法·自然语言处理·transformer·vllm
用户298698530142 小时前
PDF 转纯文本(TXT)免费攻略:轻松提取文字内容
人工智能·后端·c#