class Program
{
static void Main(string[] args)
{
double a=0;
MethodA(ref a);
Console.WriteLine(a);
double b=2;
MethodB(out b);
Console.WriteLine(b);
Console.ReadLine();
}
static void MethodA(ref double a)
{
a = 0;
a++;
}
static void MethodB(out double b)
{
b = 0;
b++;
}
如果没有out或者ref,则输出的a=0,b=2;
加了out和ref之后,a=1,b=1,即变为引用,二者同时变。作用相当于a=MethodA(a);b=MethodB(b),重新赋值。
out和ref几乎等同,
都是通过关键字找到定义在主函数里面的变量的内存地址,并通过方法体内的语法改变它的大小。不同的是ref的参数a必须在调用方法之前初始化;而out的参数必须在方法体内初始化。
说到这一点,想到了开发前期,经常遇到很多需要重新赋值,而有一些不需要重新赋值也会自动变的。
转一下别人的文章:https://blog.csdn.net/lsl277879661/article/details/56481650
一、值类型和引用类型
C# 中的类型一共分为两类,一类是值类型(Value Type),一类是引用类型(Reference Type)。
值类型包括结构体(struct)和枚举(enum)。
引用类型包括类(class)、接口(interface)、委托(delegate)、数组(array)等。
常见的简单类型如short、int、long、float、double、byte、char等其本质上都是结构体,对应struct System.Int16、System.Int32、System.Int64、System.Single、System.Double、Syetem.Byte、System.Char,因此它们都是值类型。但string和object例外,它们本质上是类,对应class System.String和System.Object,所以它们是引用类型。
1.值类型
值类型变量本身保存了该类型的全部数据,当声明一个值类型的变量时,该变量会被分配到栈(Stack)上。
2. 引用类型
引用类型变量本身保存的是位于堆(Heap)上的该类型的实例的内存地址,并不包含数据。当声明一个引用类型变量时,该变量会被分配到栈上。如果仅仅只是声明这样一个变量,由于在堆上还没有创建该类型的实例,因此,变量值为null,意思是不指向任何类型实例(堆上的对象)。对于变量的类型声明,用于限制此变量可以保存的类型。
二、值传递和引用传递
C#中方法的参数传递默认的是值传递,引用传递和输出传递需要在参数类型前面对应加上ref、out限制符,由于输出传递和引用传递类似,这里只讨论引用传递。
值传递参数是原变量的拷贝,值传递参数和原变量的内存地址不同,因此方法中对值传递参数的修改不会改变原变量。
引用传递参数是原变量的指针,引用传递参数和原变量的内存地址相同,相应的方法中对引用传递参数的修改会改变原变量。