传值参数(值参数)
1、数据类型为值类型:
值参数也就是未用ref和out修饰符修饰(未使用任何修饰符)声明的参数,在值参数被方法调用时会在栈中被分配内存以形参的方式来被调用;也就是说在堆中的实参不会参与方法的调用,而是在栈中分配新的内存将实参传入,以栈中形参(实参在栈中的副本)的方式被方法调用。
class Program
{
static void Main(string[] args)
{
Student Jia1 = new Student();
int y = 100;
Jia1.Addone(y); //将y的形参传入方法进行调用
Console.WriteLine(y);
Console.ReadKey();
}
}
class Student //声明一个“类”
{
public void Addone(int x) //这里传进方法的是一个值类型的参数
{
x = x + 1;
Console.WriteLine(x);
}
}
这里输出x=101,y=100,所以说明了”Addone“方法只对y的形参(也就是在栈中的副本)进行操作,而不会对在堆中的y有任何影响。
2、数据类型为引用类型,并且调用时使用“new”操作符创建了新的对象交给”形参“去引用:
与值类型一样,方法都是对所谓的”形参“进行操作,而实参不会受到影响;在方法调用前后(赋值前),引用变量和引用参数的初始值(实参和形参)都指向的是同一个对象(存储着同一对象的地址);在赋值之后(方法内部),由于传进来的(方法调用的)是一个引用类型的值,那么这个引用类型的”形参“被赋值之后会由于赋值号的右边为new操作符的表达式,进而又创建了一个新的对象并且调用对象的实例构造器然后把传进来的值赋给这个对象,而新的引用参数则存储的是新的对象的地址。
简单的来说就是这个所谓的副本,就是一个新的引用类型的变量,这个副本所指向的对象是新的对象(副本的对象),新的对象拥有新的地址
class Program
{
static void Main(string[] args)
{
Student Jia = new Student() { Name="Alex"};
SomeMethod(Jia);
Console.WriteLine("Hashcode={0}, Name={1},",Jia.GetHashCode(), Jia.Name);
Console.ReadKey();