今天在浏览博文时,看到这篇文章:C#中的ref 传进出的到底是什么 ? 在传东西时使用ref的疑问
引用类型就传的就是地点,值类型传的就是值,可是还仍有那么多人迷惑,网上虽然传布着很多ref 的相关文章,似乎都没为大伙解下惑。
比来有人在看我 CYQ.Data 框架 的时候说起,既然class是引用地点,自己传的就是地点,你代码中还要写ref通报来干什么;
贴出来做示例:
/// <summary>
/// by 路过秋天
/// </summary>
class Program
{
static void Main(string[] args)
{
Person p = new Person("张三");
Change(p);
Write(p.Name); //输出的是张三 并不是李四
Change(p, "李四");
Write(p.Name);//输出的是李四
Change(ref p);
Write(p.Name); //输出的是王五
Console.ReadKey();
}
static void Change(Person p)
{
p = new Person("李四");
}
static void Change(Person p, string name)
{
p.Name = name;
}
static void Change(ref Person p)
{
p = new Person("王五");
}
}
这里趁便截图让大伙看看是怎么调试而解惑的。
F5运行:
1:我们运行到第一行代码,断点:
重点说明:p地点:0x044becf8
2:我们运行到Change(p)内部中
重点说明:p地点产生变革:0x044becd0
简单说:你这内部的p和外面的p都不一样,所以不会影响外面p的地点。
备注p值的地点变革了,是因为断点在第一行代码时还没执行实例化,所以其值是一样的。
于是第一行功效输出:张三
3:接下来运行到Change(p,"李四") 函数内部
重点说明:这里内部的p的地点还是产生了变革,酿成了0x044becd0
然而其指向的值是一样的,所以你把值改了,所以“李四”就出来了。
备注:内部的p和外面的p虽然不一样,但是指向的值是一样的。
于是第一行功效输出:李四
4:最后是 Change(ref p) 函数内部
重点说明:这里内部的p地点和外部的p地点是一样的,没有产生变革。
然后从头指向一个新的东西,,只是东西的值地点产生了变革。
备注:外部p地点=内部p地点,所以其指向的值都是新的东西的值。
于是第三行功效输出:张三
最终功效图如下:
最后结言: