关于ref关键字和out关键字的个人理解

在使用c#的时候,我们有时候会有这样的烦恼
我想实现一个加法的操作,将其封装到了一个方法中

        static void sumNum(float a,float b)
        {
            a = a+b;
        }
        static void Main(string[] args)
        {
            float a, b;
            a = 5.0f;
            b = 6.5f;
            sumNum(a,b);
            Console.WriteLine("a的值为{0}",a);
            Console.ReadKey();
        }

但是按照这个方法,结果输出的竟然时a在外部的值,这不符合我们的预期
在这里插入图片描述

如何让a获取到方法内部的变化呢?这里就引入了ref和out关键字

在了解ref和out关键字之前,我们需要了解什么是值类型和引用类型
在了解值类型和引用类型之前,我们还需要了解什么是堆栈(开始套娃)
堆栈简述
堆栈,就是计算机存放数据的一个数据模型
自然,这个模型分为堆和栈两部分。
不过为什么要分成两部分呢?这里我们举一个例子

小明有一天想买衣服,
然后他去了服装店,
看到了展示柜里面好多衣服,
他很快选好了衣服,之后跟店员沟通说柜子里衣服的尺码不符合他的尺寸,
所以店员去仓库找到了符合小明尺寸的衣服,小明开开心心付了钱拿了衣服就回家了

这里面,展示柜就相当于栈,而存放大量衣服的仓库就相当于是堆
也就是一些简单结构的数据和复杂数据的索引存放在栈中,复杂数据的数据对象则存放在堆之中。这就是堆栈的概念

引用类型也就是将数据部分存放在堆中,栈中只放置索引。
值类型则是将数据直接放在栈中。

了解了堆栈之后,最开始遇到的问题就有了解答:为什么a不会继承方法内的变化呢?
因为在方法中所有的数据都是重新申请内存,独立出来的。所以方法题内的a和方法外的a并没有什么关系
但是上面的问题就没有解决方法了嘛?有
refout关键字就是解决的方法
ref和out关键字都可以让值类型获取到方法内的变化

既然这两个关键字都可以实现我们的需求,那么这两个关键字有什么区别呢?

ref关键字需要在方法声明之前将其初始化,而out关键字则是在方法内部必须进行赋值,否则会报错。

因为ref的原理是将修饰的值类型的地址传给形参,有点像指针。
而out则是将值类型的值赋给了形参,在方法之后结束后将变化后的值返回。

下面是ref和out类型使用的一些点:

首先,ref和out关键字都是针对值类型,对引用类型无效
ref和out关键字在使用的时候都需要在方法声明和使用的时候进行标注,如
在这里插入图片描述
使用引用类型时并不会报错,但是ref和out关键字也不会起到对应的作用
使用引用类型时并不会报错,但是ref和out关键字也不会起到对应的作用
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值