C#学习笔记4
开发环境:vs2022
1. 方法(method)的由来
- 方法(method)的前身是C/C++语言的函数(function ),方法是面向对象范畴的概念,在非面向对象语言中仍然称为函数;
- 永远都是类(或结构体)的成员,C#语言中函数不可能独立于类(或结构体)之外,只有作为类(结构体)的成员时才被称为方法。C++中是可以独立于结构体之外的,称为“全局函数”;
- 是类(或结构体)最基本的成员之一。最基本的成员只有两个——字段与方法(成员变量与成员方法),本质还是数据+算法;
- 方法表示类(或结构体)“能做什么事情”;
- 方法和函数的作用:隐藏复杂的逻辑,把大算法分解为小算法,复用。
2. 使用Π等数学量可以使用Math类
public double GetCircleArea(double r) //求圆的面积
{
return Math.PI * r * r;
}
3. 方法的声明与调用
- C#中方法的声明和定义不分家,即没有头文件,声明和调用是放在一起的
- 方法的声明
- 方法的命名规范
- 使用Pascal 大小写
- 需要以动词或者动词短语作为名字
- 静态方法和类绑定,和实例方法不同
internal class Program { static void Main(string[] args) { Calculator c = new Calculator(); double result = c.GetCircleArea(3); //实例方法调用 double result2 = Calculator.GetCircleArea2(3); //静态方法调用 } } class Calculator { //实例方法 public double GetCircleArea(double r) { return Math.PI * r * r; } //静态方法 public static double GetCircleArea2(double r) { return Math.PI * r * r; } }
- 方法的调用(和C语言一样)
- 调用操作符就是圆括号
- 括号中传入实际参数(Argument)
- 调用方法时的实参(argument)列表要和定义方法时的形参(parameter)列表相匹配,值的类型和数量都要匹配
4. 构造器(constructor)
- 构造器是类型的成员之一
- 狭义的构造器指的是“实例构造器”(instance constructor)
- 默认构造器
internal class Program { static void Main(string[] args) { Student stu = new Student(); Console.WriteLine(stu.ID); //输出是0,已经为ID默认初始化为0,这就是默认构造器的作用 } } class Student { public int ID; public string Name; }
- 自定义构造器
internal class Program { static void Main(string[] args) { Student stu = new Student(); Console.WriteLine(stu.ID); //输出是1 Console.WriteLine(stu.Name); //输出为Test } } class Student { public Student() //自定义构造器,自己设置默认值 { this.ID = 1; this.Name = "Test"; } public int ID; public string Name; }
- this 关键字:引用类的当前实例
- 自定义构造器加入形式参数
internal class Program { static void Main(string[] args) { Student stu = new Student(1, "MyName"); Console.WriteLine(stu.ID); //输出是1 Console.WriteLine(stu.Name); //输出为MyName } } class Student { public Student(int initID, string initName) //自定义构造器加入形式参数 { this.ID = initID; //this 关键字引用类的当前实例 this.Name = initName; } public int ID; public string Name; }
- 快捷生成构造器代码片段
输入ctor,然后按两下Tab键,就生成一个构造器代码片段public Student() { }
- 构造函数在内存中的作用原理 (以上面的代码为例)
首先创建引用变量stu后,系统会在栈区开辟一块四个字节的空间,然后实例化Student(),系统会在堆区开辟一块空间,int和string一共八个字节的空间,之后把该八个字节空间的地址存到stu栈区的四个字节里。接下来构造函数发力,根据类型为变量成员赋值,如果默认就给0,否则按照自定义的内容赋值。(注意string是类类型,它还要根据字符串的长度在堆区再找一块空间去存放字符串的实际值,将存放实际值区域的地址放到之前堆区开辟的八个字节空间中。)
5. 方法的重载(Overload)
- 调用重载方法的示例
Console.WriteLine有19种方法重载static void Main(string[] args) { Console.WriteLine(true); Console.WriteLine(100); Console.WriteLine(10.0D); Console.WriteLine(3.0); Console.WriteLine(100L); }
- 声明带有重载的方法
- 方法签名(method signature)由方法的名称、类型形参的个数和它的每一个形参(按从左到右
的顺序)的类型和种类(值、引用或输出)组成。方法签名不包含返回类型。 - 实例构造函数签名由它的每一个形参(按从左到右的顺序)的类型和种类(值、引用或输出)组
成。 - 重载决策(到底调用哪一个重载):用于在给定了参数列表和一组候选函数成员的情况下,选择
一个最佳函数成员来实施调用。
- 方法签名(method signature)由方法的名称、类型形参的个数和它的每一个形参(按从左到右
6. 对方法进行Debug
- 设置断点(breakpoint)
- 观察方法调用时的call stack(调用堆栈)
- Step-in, Step-over, Step-out
- 观察局部变量的值与变化(监视)
7. 方法的调用与栈
- 方法调用时栈内存的分配——对stack frame的分析
(看链接视频里面的最后15分钟)
出处链接: link