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);
}
}