如果只是简单类型,比如 int,double 这些,in 与 ref 的区别很大的。因为使用 in 时,传的是值。
但是对象的话,我估计使用 in 时,对象本身的地址其实就是一个指向对象的指针了。所以,在调用函数或方法时传递对象用 in ,就是把 对象指针传入。类似于 C++ 中的 *ptr。
使用 ref 时,我估计是传入一个指向对象指针的指针。类似于 C++ 中的 **ptr。也可能C# 实现时,直接就当作传入对象的指针。
唯一明显可能会影响到程序稳定的是,in 时参数可以为null,这样在方法内部必须先判断传入的对象是否存在。而用 ref 时,在编译的过程中,就会检查参数是否为 null,为 null 就会报编译错误,这样对写程序的人来说,更简洁与方便了。
using System;namespace testInRef {class testClass{public int i = 10;}class Program{static void changeTestIn(in testClass c ){c.i = 100;}static void changeTestRef(ref testClass c){c.i = 200;}static void test(){testClass t = new testClass();Console.WriteLine("before change, i = {0}", t.i);changeTestIn(t);Console.WriteLine("after changeTestIn(), i = {0}", t.i);changeTestRef(ref t);Console.WriteLine("after changeTestRef(), i = {0}", t.i);t = null;changeTestIn(t);}static void Main(string[] args){test();}} }
//运行结果
//before change, i = 10
//after changeTestIn(), i = 100
//after changeTestRef(), i = 200
//未经处理的异常: System.NullReferenceException: 未将对象引用设置到对象的实例。
//在 testInRef.Program.changeTestIn(testClass& c) 位置 D:\Temp\csharp_workspace\test\testInRef\Program.cs:行号 14
//在 testInRef.Program.test() 位置 D:\Temp\csharp_workspace\test\testInRef\Program.cs:行号 37
//在 testInRef.Program.Main(String[] args) 位置 D:\Temp\csharp_workspace\test\testInRef\Program.cs:行号 42
//请按任意键继续. . .