C#:out和ref的用法

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限制符,由于输出传递和引用传递类似,这里只讨论引用传递。

值传递参数是原变量的拷贝,值传递参数和原变量的内存地址不同,因此方法中对值传递参数的修改不会改变原变量。

引用传递参数是原变量的指针,引用传递参数和原变量的内存地址相同,相应的方法中对引用传递参数的修改会改变原变量。



猜你喜欢

转载自blog.csdn.net/niaxiapia/article/details/80920030
今日推荐