C# ReadOnly
- ReadOnly
- 先看两种情况
- 1.值类型
- 2.引用类型
- 结论
- 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);}
}