C#(6):方法的定义、调用与调试

复用:自顶向下,逐步求精,面向过程,隐藏复杂的逻辑

形参是变量,实参是值。将实参赋给形参。

()也是一种构造器

当创建类时没有创建构造器,系统会自动创建默认构造器。

当创建构造器后,强制类型会使默认构造器失效,此时需要在构造器中赋值。

构造器的内存原理:栈分配时由高到低分配地址,直到栈顶,再分配就会栈溢出
首先,栈中分配变量名,new之后在托管堆里分配内存给实例,实例内存再分配给类的属性字段,分配属性字段二进制默认刷0。如下图:。然后再将堆内存的起始内存编号转换为二进制赋值给栈内存中:。当第一次分配的堆内存容量不足(存储string时)时,将进行二次的内存转储,再在堆内存中开辟一部分内存,并将其实内存编号赋值给第一次分配的堆内存中。

方法的重载(Overloading):在C#中是指在同一个类中可以创建多个同名的方法,这些方法的参数列表的数据类型、顺序或数量不同。这样做的目的是提供同一种行为的不同变体,从而使代码更具可读性和可用性。

例如,你可能有一个用于画图形的类,这个类有一个名为“Draw”的方法,用于画一个默认大小和颜色的形状。但是,你也可能想要画一个不同大小或颜色的形状。此时,你可以重载“Draw”方法,以便能够接受不同的参数,例如颜色和大小。

方法重载的主要优点包括:

1. 提高了代码的可读性和复用性。
2. 提供了使用方便的接口设计,用户可以根据自己的需求选择最适合的方法。
3. 提高了程序的灵活性,使得程序能应对不同数据类型的输入参数。

debug:先设断点,以调试模式运行(start debugging),触发断点后程序会卡在断点的位置。

1.call stack(调用栈):查看卡在断点时的调用深度,最顶层是当前调用的函数。调用栈越深内存中所占内存越大,其内存栈越大。

2.step-into:调试方式,f11,走进正在被调用的函数查看细节。连续点击逐步调试。调用栈逐层减少。最细致的debug方法。

3.step-over:调试方式,f10,隐藏部分细节的debug方法,执行当前行的代码。如果当前行调用了其他函数,它不会进入该函数内部,而是将该函数当作一个整体执行完,然后跳到下一行。

4.step-out:调试方法,shift+f11,如果你当前在一个被调用的函数内部,按下step out按钮或快捷键,它会执行完当前函数剩余的代码,并将执行控制权交回给调用函数的下一行。

stack frame(堆栈帧):方法在被调用时,在栈内存中的布局。

哪个函数调用参数,哪个函数负责为参数开辟单独的堆栈存放变量。压栈时c#从左往右压变量。

返回值存在寄存器中,一个函数返回值之后之前开辟的堆栈存放的变量stack frame被清除,函数所占的堆栈也被清除。寄存器会不断刷新栈中的返回值的值。

当调用层级过深,调用的函数不断开辟新的堆栈,就会导致栈溢出(stack overflow)。

posted @ 2023-09-20 17:47  HY10-SALTEST-FISH  阅读(53)  评论(0编辑  收藏  举报