首页 > 编程语言 > 详细

C#语言入门(6)方法的定义,调用与调试

时间:2021-07-22 11:15:23      阅读:14      评论:0      收藏:0      [点我收藏+]

1、方法的由来

(1)方法的前身是C/C++语言的函数(function)

  • 方法是面向对象范畴的概念,在非面向对象的语言中仍称为函数
  • 使用C/C++语言做对比
    
    double ADD(double a, double b)
    {
    return a + b;
    }
    int main()
    {
    double a = 3.0; 
    double b = 5.0;
    double result = ADD(a, b);
    printf(" % f + % f = % f", a, b, result);
    return 0;

}

### (2)永远都是类(或结构体)的成员
- C#语言中不可能独立于类(或结构体)之外
- 只有作为类(或结构体)的成员时才被称为方法
- C++中是可以的,称为全局函数
### (3)是类(或结构体)最基本的成员之一
- 最基本的成员只有两个—— 字段与方法(成员变量与成员方法),本质还是数据+算法
- 方法表示类(或结构体)“能做什么事情”
### (4)为什么需要方法和函数
- 目的一:隐藏复杂的逻辑
- 目的二:把大算法分解为小算法
- 目的三:复用(reuse,重用)
- 示例:计算圆面积,圆柱体积,圆锥体积
```c#
class Calculator
    {
        public double GetCircleArea(double r)
        {
            return 3.14 * r * r;
        }
        public double GetCylinderVolume(double r, double h)
        {
            return 3.14 * r * r * h;
        }

        public double GetConeVolume(double r, double h)
        {
            return 3.14 * r * r * h / 3;
        }

    }

复用后,若想改变3.14就不用一个一个地去在程序中修改
```c#
class Calculator
{
public double GetCircleArea(double r)
{
return 3.14 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;
    }

}
## 2、方法的声明和调用
### (1)、声明方法的语法详解
- 参见c#语言文档(声明/定义不分家)
- Paramete全称为“formal parameter”
  形式上的参数,简称“形参”
- Parameter是一种变量
### (2)、方法的命名规范
- 大小写规范(pascal法)
- 需要以动词或动词短语作为名字
### (3)、重温静态方法和实例方法
### (4)、调用方法
- Argument中文c#文档的官方译法为实际参数,简称“实参”
可理解为调用方法时的真实条件
- 调用方法时的Argument列表要与定义方法时的Parameter列表相匹配
  - c#是强类型语言,argument是值,parameter是变量,值与变量一定要匹配,不然编译器会报错
## 3、构造器
- 构造器(constructor)是类型的成员之一
- 狭义的构造器指的是“实例构造器”(instance constructor)
- 如何调用构造器
- 声明构造器
  - ctor+双击tab=构造器
- 构造器的内存原理
```c#
namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Student stu = new Student(2,"Mr Okay");
            Console.WriteLine(stu.ID);
            Console.WriteLine(stu.Name);
            Console.WriteLine("==============");
            Student stu2 = new Student();
            Console.WriteLine(stu2.ID);
            Console.WriteLine(stu2.Name);

        }

    }
    class Student
    {
        public int ID;
        public string Name;
       public Student(int initId,string initName)
        {
            this.ID = initId;
            this.Name = initName;
        }
        public Student()
        {
            this.ID = 1;
            this.Name = "No Name";
        }
    }
}

技术分享图片
上述程序中“Mr Okay”会产生双转存,因为string(字符串)为引用类型
技术分享图片

4、方法的重载(overload)

  • 调用重载方式的示例
  • 声明带有重载的方法
    • 方法签名(Method Signature)由方法的名称、类型形参的个数和它的每一个形参(按从左到右的顺序)的类型和种类(值、引用或输出)组成。方法签名不包含返回类型
  • 实例构造函数签名由它的每一个形参(按从左到右的顺序)的类型和种类(值、引用或输出)组成。
  • 重载决策(到底调用哪一个重载):用于在给定了参数列表和一组候选函数成员的情况下,选择一个最佳函数成员来实施调用。
    ```c#
    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 double Add(double x, double y)
    {
    return x + y;
    }
    }
    
    ## 5、如何对方法进行debug
  • 设置断点(breakpoint)F9
  • 设置方法调用时的call stack(调用栈)
    技术分享图片
    最上层是被调用的函数,下一层是调用函数的部分
  • Step-in(逐寻语句),Step-over(直寻结果),Step-out(跳出)
  • 观察局部变量的值与变化(locals)

    6、方法的调用与栈

  • 方法调用时栈内存的分配
    • 对stack frame的分析
      stack frame:方法在被调用时,其在栈内存中的布局
      调用的数据归caller(调用者)管,先压左边后压右边

C#语言入门(6)方法的定义,调用与调试

原文:https://blog.51cto.com/u_15296868/3157501

(0)
(0)
   
举报
评论 一句话评论(0
分享档案
最新文章
教程昨日排行
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!