值参数:方法声明时,不带任何修饰符的形参,就被称为值参数。
- 值参数(形参)本质上是一个局部变量,它的初始值来自方法调用时传递过来的实参
- 值参数所在的方法被调用的时候,传递的实参必须能够隐式地转换成形参的类型
- 值参数所在的方法被调用的时候,会将实参的值拷贝一份给形参(创建副本),这样方法调用前后,都不会对实参有影响
值参数的类型为值类型
static void Main(string[] args)
{
int x = 10;
AddOne(x);
Console.WriteLine(x);//10
Console.ReadKey();
}
static void AddOne(int p)
{
p = p + 1;
Console.WriteLine(p);//11
}
分析:p是值参数,调用p所在的方法时,实参的值被拷贝了一份给了形参p,所以操作p不会对x有任何影响
值参数的类型为引用类型
- 在方法内部创建了新对象,赋值给形参
class Program
{
static void Main(string[] args)
{
var stu = new Student() { Name = "xiaoming", Age = 18 };
//对象的hashcode是唯一的 使用hashcode可以判断两个对象是否相等
Console.WriteLine(stu.GetHashCode());//输出:46104728
PrintInfo(stu);
//方法调用后 实参stu的数据信息
Console.WriteLine(stu.Name+"--"+stu.Age);//输出:xiaoming--18
Console.Read();
}
static void PrintInfo(Student student)
{
student = new Student() { Name="jaychou",Age=33};
Console.WriteLine(student.GetHashCode());//输出:12289376
Console.WriteLine(student.Name + "--" + student.Age);//输出:jaychou--33
}
}
class Student
{
public int Age { get; set; }
public string Name { get; set; }
}
分析:值参数类型为引用类型时,实参在调用前和调用后没有发生变化
- 在方法内部,只操作形参引用的对象,不创建新的对象
class Program
{
static void Main(string[] args)
{
var stu = new Student() { Name = "xiaoming", Age = 18 };
//对象的hashcode是唯一的 使用hashcode可以判断两个对象是否相等
Console.WriteLine(stu.GetHashCode());//46104728
PrintInfo(stu);
//方法调用后 实参stu的数据信息
Console.WriteLine(stu.Name+"--"+stu.Age);//jaychou--33
Console.Read();
}
static void PrintInfo(Student student)
{
student.Name = "jaychou";
student.Age = 33;
Console.WriteLine(student.GetHashCode());//46104728
Console.WriteLine(student.Name + "--" + student.Age);//jaychou--33
}
}
class Student
{
public int Age { get; set; }
public string Name { get; set; }
}
分析:从打印结果来看,调用前后实参引用的对象的hascode没有变;但是改变的引用的对象中的数据