C# 五、方法的定义、调用与调试

五、方法的定义、调用与调试

在这里插入图片描述

方法的由来

在这里插入图片描述

c语言中的函数在这里插入图片描述

C++中的函数在这里插入图片描述

当函数以类的成员出现的时候,就变成了方法了在这里插入图片描述

C#和java是纯面对对象的语言,已经把非面对对象的部分都抛弃了

示例:

namespace CSharpFun {
    internal class Program {
        static void Main(string[] args) {
            
        }
    }

    //计算圆的面积,圆柱的体积,圆锥的体积
    class Calculator {
        //计算圆的面积
        public double GetCircleArea(double r) {
            return Math.PI * r * r;
        }
        //计算圆柱的体积
        public double GetCylinderVolume(double r, double h) {
            return GetCircleArea(r) * h;
        }
        //计算圆锥的体积
        public double GetConeVolume(double r, double h) {
            return GetCylinderVolume(r, h) / 3;
        }
    }
}

方法的定义与调用

在这里插入图片描述

C++中方法的声明和定义是分开的

在这里插入图片描述

调用方法会传入实参,并且传入的实参需要与该方法所定义的形参匹配

namespace CSharpFun {
    internal class Program {
        static void Main(string[] args) {
            Calculator cal = new Calculator();
            double res = cal.GetCircleArea(5);
            Console.WriteLine(res);
        }
    }

    //计算圆的面积,圆柱的体积,圆锥的体积
    class Calculator {
        //计算圆的面积
        public double GetCircleArea(double r) {
            return Math.PI * r * r;
        }
        //计算圆柱的体积
        public double GetCylinderVolume(double r, double h) {
            return GetCircleArea(r) * h;
        }
        //计算圆锥的体积
        public double GetConeVolume(double r, double h) {
            return GetCylinderVolume(r, h) / 3;
        }
    }
}

构造器

在这里插入图片描述

namespace ConstructorExample {
    internal class Program {
        static void Main(string[] args) {
            Student student = new Student();
            Console.WriteLine(student.ID);
            Console.WriteLine(student.Name);
            Console.WriteLine("===========================");
            Student student2 = new Student(2, "nihao");
            Console.WriteLine(student2.ID);
            Console.WriteLine(student2.Name);
        }
    }
    class Student {

        public int ID;
        public string Name;

        public Student() {
            this.ID = 1;
            this.Name = "No Name";
        }
        public Student(int initID, string initName) {
            this.ID = initID;
            this.Name = initName;
        }
        /*
         * 构造器没有返回类型
         * 可以有多个构造器,但是构造器的形参必须不同
         * 快速写出构造器的方法,打出ctor,然后按两下Tab键
         */
    }
}

构造器的内存原理

栈分配内存是从比较高的地址往比较低的地址分配的,直到分配到栈顶,没有内存可分配了,这个时候栈就溢出了

这一部分的内存讲解很重要

/*
 * 首先在堆中创建int,然后给ID赋值,并转成二进制,存入堆中,
 * 然后创建string,因为string是引用类型,所以还要去堆中找一个位置
 * 存储字符串转成的二进制形式,然后把这块地址,返回给Name,然后把ID 和 Name
 * 的地址返回给栈中的对象
 */

在这里插入图片描述

方法的重载

在这里插入图片描述

重载方法的示例:

Console.WriteLine(100);
Console.WriteLine("hello,world");
Console.WriteLine(1000L);
Console.WriteLine(2.0D);
//以上这些就是方法的重载
//重载,就是方法的名字是相同的,但是传入的参数个数、类型、顺序等等不同(总的来说就是方法的签名不同)

方法重载的示例:

起初,我们只需要知道,方法签名,包含名字,和参数列表,方法签名不一样,就可以构成重载

namespace OverloadExample {
    internal class Program {
        static void Main(string[] args) {
            Console.WriteLine("Hello, World!");
        }
    }
    class Calculator {
        public int Add(int a, int b) { 
            return a + b;
        }
        public int Add(int a, int b, int c) {
            return a + b + c;
        }
        //类型的形参不一样
        public int Add<T>(int a, int b, int c) {
            return a + b + c;
        }
        //参数的种类不一样
        //使用的是引用参数
        public int Add(ref int a, int b) {
            return a + b;
        }
        public double Add(double a, double b) { 
            return a + b; 
        }
}

根据传入的参数,来决定,调用哪一个方法

对方法Debug

在这里插入图片描述

在这里插入图片描述

Call Stack就像是一个记录方法调用的栈,可以非常直观的看到调用关系

方法的调用与栈

在这里插入图片描述

stack frame方法被调用的时候在内存中的布局

在这里插入图片描述

这部分的演示可以反复观看

也可以看这篇文章

C#学习笔记(四)方法的调用与栈的关系_调用方法是栈-CSDN博客

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值