in
关键字会导致按引用传递参数,但确保未修改参数。 它让形参成为实参的别名,这必须是变量。从C++角度来说,in关键字有点类似于const T&
1)当in修饰基本数据类型时,我们无法修改基本数据类型的值,只能读取。
- void SetValue(in int i)
- {
- i = 4;//报错
- }
2) 当修饰struct数据类型的时候也是只能读取。
- public struct ValueType
- {
- public int i;
-
- public void Set()
- {
- i = 1;
- }
- }
- public class ReadOnlyTest : MonoBehaviour
- {
- ValueType valueType = new ValueType();
- void Seti2(in ValueType valtype)
- {
- valtype.i = 4;//报错
- }
- }
引用类型就比较灵活了,其是可以修改引用类型的成员变量的值的。
- public class RefType
- {
- public int i = 0;
- }
- public class ReadOnlyTest : MonoBehaviour
- {
- RefType refType = new RefType();
- void Seti1(RefType reftype)
- {
- reftype.i = 4;//可以正常修改
- }
- }
- void SetValue(in int i)
- {
- Debug.Log(i);
- }
- void SetValue(int i)
- {
- Debug.Log(i);
- }
- void Start()
- {
- SetValue(i);
- SetValue(in i);
- }
该部分参考自:in 参数修饰符 - C# 参考 | Microsoft Docs
out关键字跟in很像,基本像是一对。不过对out关键字来说其不仅可以读取,还能被赋值,同时也必须被赋值。
- void SetValue(out int i)
- {
- i = 9;
- int k=i;
- }
- void Start()
- {
- int i = 0;
- SetValue(out i);
- Debug.Log(i);//将打印9
- }
1) 在某些情况下,按引用访问值可避免潜在的高开销复制操作,从而提高性能。
2)不要混淆通过引用传递的概念与引用类型的概念。 这两种概念是不同的。 无论方法参数是值类型还是引用类型,均可由 ref
修改。 当通过引用传递时,不会对值类型装箱。
ref主要对值类型会有较大的影响,其修饰函数形参与in和out没有很大区别。
但是比较有趣的是其可以直接修饰变量。这真就跟C++的左值引用一模一样了。
- void Start()
- {
- int i = 0;
- ref int k = ref i;
- k = 3;
- Debug.Log(i);//i=3
- }
并且还可以跟readonly关键字一起使用
- void Start()
- {
- int i = 0;
- ref readonly int k = ref i;
- k = 3;//只可读,不可赋值,报错
- Debug.Log(i);
- }
1)传递到 ref
或 in
形参的实参必须先经过初始化,然后才能传递。 该要求与 out 形参不同,在传递之前,不需要显式初始化该形参的实参。