刘铁猛C#教程学习笔记4-2 方法详解(2)
构造器的内存原理
使用默认构造器时
student类有两个字段,其中ID是int类型,是占用四个字节的结构体类型
而Name是string类型,是引用类型,占用四个字节,存储的是引用的实例的地址
1.分配内存空间
使用默认的Student stu = new Student(); 时,stu是一个局部变量,应该存储在栈中
图中绿色为声明stu变量时为其准备的内存空间,现在还是空的,要等new操作符执行完后将实例地址存入

new操作符创建实例时在堆(自由存储空间)上开辟内存
该类的int字段占4字节,string字段占4字节,所以共开辟8个字节的存储空间
2.初始化
实例占用的内存空间分配好后,就要调用构造器函数了
构造器会按类型的字段切割分到的内存空间,默认构造器会将空间内值全部刷成0
string变量值都为0时,是NULL值
3.将地址存入引用变量
内存分配、初始化结束后,会将创建的实例地址存入引用变量stu
自定义构造函数
会在第二步初始化时将值存入实例的字段
string是引用变量,赋值时存的又是另一个实例的地址

方法的重载(Overload)

如图所示

Console类里有19个名字叫WriteLine的方法定义
方法名相同,但这19个方法的“方法签名”的不同,按上下键可以切换不同的重载定义,会显示不同的参数
只要方法签名不同,就可以同时定义同名方法作为重载!
方法签名
方法签名由
1.方法的名字
2.方法的类型形参(待续)
3.每一个参数(从左到右)的类型、种类(值、引用或输出)组成
但方法的签名不包括方法的返回值类型、形参变量名!
错例1:

如图所示两个参数数量、类型、种类完全相同,但返回值类型不同的方法
这样两个方法是不能同时定义的!
错例2:

形参类型、数量、种类相同,但形参变量名不同,这样两个方法也不能同时定义!
再次强调:
构成方法签名的:方法名、类型形参(目前未接触)、从左到右每一个参数类型、种类
两个方法方法名相同,签名不同时,就可以重载
补充1:类型形参
使用在泛型方法中
参数的类型也参与到方法体组成的方法
以上的<T>就是类型形参
类型形参参与构成方法签名
补充2:参数种类(引用传递、值传递)
以上不加额外修饰符的参数默认为值参数
若在参数类型前加上修饰符ref,就会将其转换为引用传递的参数
若在参数类型前加上修饰符out,就会将其转换为输出参数
称作参数的种类,参数的种类参与构成参数签名
实例构造器也可以使用重载,构造器的签名由方法名(与类型名相同的)、形参列表构成
重载决策
根据调用时传递进方法的参数的数量、类型来决定使用哪个方法定义
方法的debug(以VS中为例)

1.断点
在代码一行前面的空白点一下,设置断点后,在调试模式运行时,程序运行到这一行时会暂停,此时可以观察程序的状态,在VS中此时将鼠标放在任意一个变量上,会显示该变量当前的值


2.Call stack(调用栈)
“call stack”窗口会显示调用了断点所在语句的地方
有几层牵涉到断点的调用关系,call stack就有几层,就更深
可以称作调用栈
递归方法如果出现无限递归,调用栈就会越来越深,最后导致内存爆栈
3.Step into(步入、逐步执行)
快捷键为F11
单步执行,遇到子函数就进入并且继续单步执行

按F11键,跳转到当前选中的正在被调用的函数的函数体
每按一次F11,call stack窗口就会减少一层
(在调用关系上走到上一层,对调用关系抽丝剥茧)
“最细腻的debug方式”
4.Step over(步过)
快捷键为F10
在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完在停止,也就是把子函数整个作为一步

遇到调用函数时,直接走完此函数得到结果
对确认无问题的函数,可以用F10跳过,对有怀疑的函数,可以按F11走进去逐步检查
“稍粗旷一些的debug方式”
5.Step out
在单步执行到子函数内时,用Step out就可以执行完子函数余下部分,并返回上一层函数。

6.观察局部变量的值的变化
在local窗口中可观察当前打有断点的函数内的局部变量的值
