目录
值传递:
将一个值类型A通过参数传入方法,或者通过 = 传给另外值类型B。其中只是将A的数据赋给了B,在内存上又额外占用新内存存储A的数据, AB二者之间的数据是相互分离的,这就是值传递。
引用传递:
引用类型存储在堆内存上,在栈区存在是该对象在内存上的地址指引。而引用传递就是将地址指引再次传给另外一个地址存储上,两个地址指引指向的是同一对象,当该对象发生改变时,两个地址指引都会受到影响。
namespace ConsoleApp4
{
internal class Program
{
static void Main(string[] args)
{
MyClass1 myClass1 = new MyClass1();
//值传递
myClass1._id = 1000;//设置id为1000
//调用Func 传入 值为 1000的id
Func(myClass1._id);
Console.WriteLine(myClass1._id);//输出 1000
//引用传递
myClass1._id = 7777;
Func2(myClass1);
Console.WriteLine(myClass1._id);//输出 88888
}
static void Func(int number)
{
Console.WriteLine("Func" + number);//输出 1000
number = 99999;
Console.WriteLine("Func" + number);//输出 99999
}
static void Func2(MyClass1 myClass1)
{
Console.WriteLine("Func2 "+myClass1._id);//输出为7777
myClass1._id = 88888;
Console.WriteLine("Func2 " + myClass1._id);//输出为 88888
}
}
public class MyClass1
{
public int _id;
}
}
ref&out:
若值类型想要达到引用传递的效果 可以使用关键字ref和out 来标记。在传入和接收方都是用关键字标记,传递时会将值类型的地址作为参数传递,在接收方对参数的改动数据,同时也会影响传递方。
ref:
ref 不要求所修饰的值类型在传入前是有值的,在传入时不会清空。在方法对该值类型可以不进行操作。
out:
out不要求所修饰值类型传入前的数据情况,在传入时会将其清空 。在方法结束前 必须对改值类型有所赋值。
namespace ConsoleApp4
{
internal class Program
{
static void Main(string[] args)
{
MyClass1 myClass1 = new MyClass1();
Func1(ref myClass1._name);//输出 Func1 空
myClass1._name = "dds";
Func1(ref myClass1._name);//输出 Func1 dds
Func2(out myClass1._name);//输出 小明
}
static void Func1(ref string str)
{
Console.WriteLine("Func1 " + str);
}
static void Func2(out string str)
{
//Console.WriteLine("Func2 " + str);//报错 使用了未赋值的str
str = "小明";
Console.WriteLine("Func2 " + str);//输出 小明
}
}
public class MyClass1
{
public string _name;
}
}