C# ref和out的作用和区别

全写到代码里了

作用1

以往值类型当做形参都会被重新开辟栈空间重新赋值,加上ref和out后就会把值类型也是传递指针,而不是传递值本身

using System;

namespace Lesson8_ref和out
{
    class Program
    {
        #region 知识点一 学习ref和out的原因
        //学习ref和out的原因
        //它们可以解决 在函数内部改变外部传入的内容 里面变了 外面也要变

        static void ChangeValue(int value)
        {
            value = 3;
        }

        //int a = 1;
        //ChangeValue(a);
        //Console.WriteLine(a); 这里是等于 在栈上新开辟了一个地址,跟以前不一样,而且新地址栈中存放了一个一样的值,所以 a输出还是1

        static void ChangeArrayValue(int[] arr)
        {
            arr[0] = 99;
        }
        //int[] arr2 = { 1, 2, 3 };
        //ChangeArrayValue(arr2);
        //Console.WriteLine(arr2[0]);//99  这里是99的原因就是,数组的元素是存放到堆里面的,栈里面放的是地址,这里arr是传来的地址,这两个地址同时指向的是同一个堆,所以改里面就会影响外面

        static void ChangeArray(int[] arr)
        {
            //重新申明了一个 数组
            arr = new int[] { 10, 20, 30 };
        }
        // 这个就更改不了,因为是新开辟的,所以指向的是 不同的地方+-
        #endregion

        #region 知识点二 ref和out的使用
        //函数参数的修饰符
        //当传入的值类型参数在内部修改时 或者引用类型参数在内部重新申明时
        //外部的值会发生变化

        //ref
        static void ChangeValueRef(ref int value)
        {
            //out传入的变量必须在内部赋值 ref不用
            value = 3;
        }

        static void ChangeArrayRef(ref int[] arr)
        {
            arr = new int[] { 100, 200, 300 };
        }

        //out
        static void ChangeValueOut(out int value)
        {
            //out传入的变量必须在内部赋值 ref不用
            value = 99;
        }

        static void ChangeArrayOut(out int[] arr)
        {
            arr = new int[] { 999, 888, 777 };
        }

        #endregion

        #region 知识点三 ref和out的区别
        //1.ref传入的变量必须初始化  out不用
        //2.out传入的变量必须在内部赋值  ref不用

        // ref传入的变量必须初始化 但是在内部 可改可不改
        // out传入的变量不用初始化 但是在内部 必须修改该值(必须赋值)
        #endregion


        //总结
        //1.ref和out的作用 : 解决值类型和引用类型 在函数内部 改值 或者 重新申明 能够影响外部传入的变量 让其也被修改
        //2.使用上:就是在申明参数的时候 前面加上 ref和out的 关键字即可 使用时 同上
        //3.区别
        // ref传入的变量必须初始化 但是在内部 可改可不改
        // out传入的变量不用初始化 但是在内部 必须修改该值(必须赋值)

        static void Main(string[] args)
        {
            Console.WriteLine("ref和out");
            //1.ref传入的变量必须初始化  out不用
            int a = 1;
            ChangeValueRef(ref a);
            ChangeValueOut(out a);


            //int a = 1;
            //ChangeValue(a);
            //Console.WriteLine(a);

            //ChangeValueRef(ref a);
            //Console.WriteLine(a);

            //ChangeValueOut(out a);
            //Console.WriteLine(a);

            //Console.WriteLine("***********");
            //int[] arr2 = { 1, 2, 3 };
            //ChangeArrayValue(arr2);
            //Console.WriteLine(arr2[0]);//99
            //Console.WriteLine("***********");
            //ChangeArray(arr2);
            //Console.WriteLine(arr2[0]);

            //ChangeArrayRef(ref arr2);
            //Console.WriteLine(arr2[0]);

            //ChangeArrayOut(out arr2);
            //Console.WriteLine(arr2[0]);
        }
    }
}


作用2

就是ref和out可以return返回多个数据
通常一个方法只能返回一个值,但是如果在某些时候,我们想要返回多个值,例如某个方法将一个浮点数分割成一个整数和一个小数返回去。这个时候我们就要用到out关键字。

如果用ref也可以解决,但是用ref需要在初始化的时候虚设一个值,并且还要给虚设值赋初始值。

using System;
namespace ConsoleApp7
{
    class Program
    {
        static void Main(string[] args)
        {
            double f;//保存到其他返回值
            int i = TestOut.GetParts(2.55f, out f);
            Console.WriteLine("整数部分:" + i);
            Console.WriteLine("小数部分:" + f);
            Console.WriteLine("小数部分:{0:#.###}", f);
 
            Console.ReadKey();
        }
    }
    class TestOut
    {
        public static  int GetParts(double n,out double frac)
        {
            int whole = (int)n;
            frac = n - whole;
            return whole;
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值