Unity&&C#学习笔记-变体前置知识ref、out、in详解

静态成员函数为什么不能调用非静态成员变量

然而从本质上来说类的静态成员函数的函数形参中没有默认的this指针,导致不能调用具体实例对象的成员

因为静态方法在类加载的时候就已经初始化,但非静态的资源要在类手动创建对象new出来以后才会存在

静态方法存在的时候无法保证它访问的非静态资源存在,就算能保证存在,你也无法知道获得的是哪个对象的非静态资源

in 修饰符(只读),指定参数由引用传递,可以由调用方法读取,但不可以写入。

引入 in 参数的原因

我们知道,结构体实例的内存在栈(stack)上进行分配,所占用的内存随声明它的类型或方法一起回收,所以通常在内存分配上它是比引用类型占有优势的。

但是对于有些很大(比如有很多字段或属性)的结构体,将其作为方法参数,在紧凑的循环或关键代码路径中调用方法时,复制这些结构的成本就会很高。当所调用的方法不修改该参数的状态,使用新的修饰符 in 声明参数以指定此参数可以按引用安全传递,可以避免(可能产生的)高昂的复制成本,从而提高代码运行的性能。

out 修饰符,指定参数由引用传递,必须由调用方法写入。

ref必须先赋值,因为ref在函数内可以不赋值

⼀、ref(引⽤型参数)和out(输出型参数)的区别

1、使⽤ref型参数时,传⼊的参数必须先被初始化,out型参数,必须在⽅法中对其完成初始化。

2、使⽤ref和out时,在⽅法的参数和执⾏⽅法时,都要加Ref或Out关键字,以满⾜匹配。

3、out适合⽤在需要retrun多个返回值的地⽅,⽽ref则⽤在需要被调⽤的⽅法修改调⽤者的引⽤的时候。

5、系统对ref的限制是更少⼀些的。

6、若要使⽤ ref 参数,必须将参数作为 ref 参数显式传递到⽅法,ref 参数的值被传递到 ref 参数。

7、当希望⽅法返回多个值时,声明 out ⽅法⾮常有⽤;使⽤ out 参数的⽅法仍然可以返回⼀个值。

8、ref 将值类型强制按引⽤类型进⾏传递

​ ​很多人可能会觉得这时候因为引用类型赋值时是传递的地址,那这时候第一个元素应该是3才对啊。我们来画图分析一下!

​ ​也就是,引用类型的数组new了一个新数组,就意味着在堆内存中重新开辟了内存空间,当前变量指向的地址也会随之改变。所以当改变了array后并没有影响到外部的arr数组。

【唐老狮】C#——ref和out - 知乎 (zhihu.com)