–刘铁猛《C#语言入门详解》
方法
方法:方法的前身是c/c++语言的函数(function)。是一块具有名称的代码。可以在其他地方根据名称调用该方法来编译。当一个类以成员函数的时候出现,那么它就可以称作是方法。
方法主要分为两个部分:方法头和方法体。
方法体是一个整个块,主要包含以下内容:
- 局部变量
- 控制流结构
- 方法调用
- 内嵌的块
- 局部函数
示例
Question:示例字段和局部变量的区别是什么
Answer:
实例字段 | 局部变量 | |
---|---|---|
生存期 | 从实例被创建开始,直到实例不再被访问时结束 | 从块中被声明时开始,完成执行时结束 |
隐式初始化 | 初始化成该类型的默认值 | 没有隐式初始化,若变量使用之前没有被赋值,编译器会警告 |
存储区域 | 字段属于类的成员,所有字段都存储在堆里(不考虑类型) | 值类型:存储在栈里。引用类型:引用在栈里,数据存储在堆里 |
参数
参数有几种,各自以略微不同的方式从方法传入或传出数据。
首先先认识一下两个重要的概念,用来表示传入数据跟传出数据
形参
形参又叫形式参数,是局部变量,它声明在方法的参数列表中,而不是在方法体内。**它规定了要调入该方法,需要传入什么类型的参数
public void Print(int x,int y)//int x,int y就是形式参数
{
....
}
实参
实参又叫实际参数,位于方法调用的参数列表中,负责在调用带有形参的方法时候,将形参对应类型的数据传递过去
print(3,4);//3,4都是int型,通过调用print将3,4传递过去。
值参数
值参数通过将实参的值复制到形参的方式把数据传递给方法。方法被调用的时候,系统将执行如下操作。
- 在栈中为形参分配空间
- 将实参的值复制给形参
值参数的实参不一定是变量,它可以是表达式。但是必须被赋值。
Question:值类型和值参数的区别在哪?
Answer:值类型是指类型本身就包含其值。值参数是把实参的值复制给形参。这是两个不同的概念。
Answer:值类型是指类型本身就包含其值。值参数是把实参的值复制给形参。这是两个不同的概念。
从图片(摘抄c#图解教程)可以看出(a1->stu1,a2->stu2,f1->s1,f2->s2)
- 在方法调用前,将要被用作实参的变量a1和a2已经在栈里了。
- 在方法开始时,形参的名称被设置成实参的别名。可以理解为变量a1和f1指向相同的内存位置。同理a2,f2叶指向相同的内存位置。
- 在方法内部时,代码创建了对象并把它赋值给了f1,然后赋一个值给f1的字段,也赋一个值给f2。对f1和f2的赋值都是必需的,因为他们是输出参数。
- 在方法执行后,形参的名称已经失效了,引用类型的a1和值类型的a2的值都被方法内的行为改变了。
方法的重载
重载(OverLoad):一个类中有多个同名的方法,这叫做重载。使用相同名称的每个方法必须有一个和其他方法不同的签名。
签名:由方法的名称,参数的数目,参数的数据类型和顺序,参数修饰组成。形参的名称、返回类型不是签名的一部分。
还有就是两个方法中的参数类型、参数数量相同时,顺序不同是不能造成重载的,反而会报错。