C# ReadOnly&&Ref Out


ReadOnly官方文档

ReadOnly

先看两种情况

1.值类型

当数据是值类型时,标记为Readonly时,如果再次设置值,会提示报错,无法分配到只读字段

public class A
{
    private readonly int x;
    public A(int x)
    {
        this.x = x;
        //在构造函数里,可以多次赋值,但是出了构造函数,值类型就无法变更了。
        this.x = x*2;
    }
    public void TryToUpdateInt()
    {
    	//报错,无法分配到只读字段
        x = 4;
    }
}

在这里插入图片描述

2.引用类型

这里成功给引用类型赋值

public class RefOut
{ 
    private readonly Dictionary<string, int> myDictionary = new Dictionary<string, int>();
    public RefOut()
    {
        // 添加键值对
        myDictionary.Add("One", 1);
        myDictionary.Add("Two", 2);
    }
    public void TryToAddKeyValuePair()
    {
    	//这里没有报错,运行程序
        myDictionary.Add("Three", 3);
    }
}

在这里插入图片描述

结论

ReadOnly的可读是限定变量的地址不发生改变,与变量赋的值无关。

在构造函数里,可以多次赋值,但是出了构造函数,值类型就无法变更了。

值类型,因为值类型int a = 2,每次重新赋值a的地址变了,是重新拷贝一份,会变成一个新的地址,变量的地址发生了变化。所以不能重新设置值类型的值。这里是因为值类型的每次重新赋值,地址改变,所以宏观表现为,设置了ReadOnly,就无法再改变数据了。

引用类型,因为引用类型的 List<·RefOut·> a = new List<·RefOut·> (); 当给集合添加或者删除数据时,只是new List<·RefOut·> ()的数据发生了变化,变量a代表的地址并没有进行改变。所以引用类型,即使设置了Readonly也可以重新赋值。可以更改为ReadOnlyCollection<T> 实现真正意义上的只读。

官方文档原话

在这里插入图片描述

Ref Out

用途:在将值类型传入方法时,如果改变,希望方法外的数据也会改变。

Ref Out 可以类比为C++中的指针。在C#中传参的值类型int a = 0在方法中修改a= 3,是不会改变外部的参数值,所以还是a=0。如果设置了ref或者Out参数则能改变a的值,变成a=3。

ref的参数必须有初始化值

out的初始化工作必须在方法中进行

RefOut a = new();
a.test(6, out int test01);
//ref必须在外部初始化完成
int test02 = 2;
a.test1(7, ref  test02);
public class RefOut
{
    public void test(int b,out int a)
    {
    	//out必须在内部赋值
        a = 2;
        
        a = b+a;
        Console.WriteLine(a);
    }
    public void test1(int b ,ref int a)
    {
        a = b*a;
        Console.WriteLine(a);
    }
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有诗亦有远方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值