In逆变
保证发送到方法当中的数据不被更改(值类型),当in 修饰符用于引用类型时,可以改变变量的内容,但不能更改变量本身。
Out协变
当希望方法返回多个值时,声明 out方法很有用。使用 out参数的方法仍然可以将变量用作返回类型(请参见 return),但它还可以将一个或多个对象作为 out参数返回给调用方法。
Ref
.NET的关键字 , [1] ref 关键字通过引用(而非值)传递参数。 通过引用传递的效果是,对所调用方法中的参数进行的任何更改都反映在调用方法中。 例如,如果调用方传递本地变量表达式或数组元素访问表达式,所调用方法会将对象替换为 ref 参数引用的对象,然后调用方的本地变量或数组元素将开始引用新对象。ref是Reference的缩写。
In使用例子
![f04f5383a96e0afccff81cf11384854e.png](https://i-blog.csdnimg.cn/blog_migrate/172f088dabdf70658b1ad55c699549ef.jpeg)
//in关键字 逆变
public static void TestIn(in int a, int b)
{
// a = 2; 这样的写法是错误的,因为这是 a是只读的,不能进行赋值操作
b = a;
Console.WriteLine("打印下b的值" + b);
}
测试方法的调用
![6ee3f7438e06f5f0af6e1b8a16b768fb.png](https://i-blog.csdnimg.cn/blog_migrate/db8dc8926898d6a6dc44657c1cbf2b4d.jpeg)
Console.WriteLine("****************C#中的关键字你知道多少****************");
int a, b;
Console.WriteLine("***************************开始测试逆变in的用法***********************");
a = 2; b = 4;
TestIn(a, b);
运行结果
![c7b44540414fa64ebe1c861a122caa80.png](https://i-blog.csdnimg.cn/blog_migrate/e803d73324406eb208fa6b775be34457.jpeg)
Out的使用例子
![457bdfefbfd5b6f57dc85617309ff3a1.png](https://i-blog.csdnimg.cn/blog_migrate/59dc87d852a5ac2f4cfdf9de45069d67.jpeg)
//out 关键字 协变
public static void TestOut(int a, out int b)
{
b = a;
Console.WriteLine("打印一下b的值" + b);
}
测试方法调用
Console.WriteLine("**********************开始测试协变out的用法*************************");
int t = 2;
int t2; //这时不对t2进行赋值,然后使用t2看会报错么?
TestOut(t, out t2);
Console.WriteLine("打印下t2的值" + t2); //看到t2的值变为2;说明这是不是值拷贝,传递的是参数的地址
运行结果
答案是使用未赋值的t2不会报错
![233ab40ff1a8423d29e6cceab3d4a23c.png](https://i-blog.csdnimg.cn/blog_migrate/572133542f2b6e1d8244cf1cd88a4bc3.jpeg)
由结果可以看出t2的值变为2,说明使用使用out以后传递的是地址,而不是值传递。
Ref的使用例子
![532a39d5c9a4be603a8961e0d4b1b566.png](https://i-blog.csdnimg.cn/blog_migrate/7c484b9bd594a0a4453bd6e264ca3baa.jpeg)
// ref 关键字
public static void TestRef(int a, ref int b)
{
b = a + 2;
Console.WriteLine("打印一下b的值" + b);
}
测试方法调用
Console.WriteLine("*************************开始测试ref的用法***************************************");
//int q = 2;
//int q2;
//TestRef(q,ref q2); //这样是错误的,q2必须初始化
int q = 6;
int q2 = 4;
TestRef(q, ref q2);
Console.WriteLine("打印下q2的值" + q2);
// 发现q2的值变为8,由此也可以发现,使用ref 时也不是值传递,传递的是参数的地址。
// 还可以发现 ref与out的区别 : ref 修饰的在使用时必须进行初始化 ,而用out修饰的不用初始化
运行结果
![6aba2c619d6c556fb240cfc9fb54b684.png](https://i-blog.csdnimg.cn/blog_migrate/70bde5f9d39b7f05953ef090adfdd96b.jpeg)
总结
ref与out的区别 : ref 修饰的在使用时必须进行初始化 ,而用out修饰的不用初始化