C#中的 ref 传进出的到底是怎么 解惑篇

前些天在浏览博文时,看到这篇随笔:C#中的ref 传进出的究竟是哪些 ?
在传对象时利用ref的疑难

另附言:

正文写于中午,就在想昭示的这弹指间,靠,集团断网了,原来修改的一部分丢失了。
网一断就是一天了,现在赶回家才把之发表。

 

 

一直大家都知情,引用类型就传的就是地方,值类型传的就是值,不过还仍有那么几个人迷惑,网上即便流传着累累ref
的相关散文,似乎都没为大伙解下惑。

近来有人在看本身 CYQ.Data
框架
 的时候说起,既然class是引用地址,本身传的就是地点,你代码中还要写ref传递来干什么;

本来以前知道的,被忽悠一下变不通晓了,还认为自己原本的代码写错了。

 

今天在帮人家回复时,才把自己的惑给解了。

这边我把上篇著作原问题的代码小修改了一晃

贴出来做示范:

C# 1C# 2

  /// <summary>
    /// by 路过夏季 http://cyq1162.cnblogs.com
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
           Person p = new Person(“张三”);
           Change(p);
           Write(p.Name); //输出的是张三 并不是李四

           Change(p, “李四”);  
C#,           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:大家运行到第一行代码,断点:

C# 3

一言九鼎表明:p地址:0x044becf8

 

 

2:大家运行到Change(p)里面中

C# 4

 

重中之重表明:p地址发生变化:0x044becd0

简单说:你这里面的p和外面的p都不相同,所以不会影响外面p的地点。
备注p值的地址变更了,是因为断点在第一行代码时还没实施实例化,所以其值是千篇一律的。

 

于是第一行结果输出:张三

 

3:接下去运行到Change(p,”李四”) 函数内部

C# 5

 

重要表明:这里内部的p的地址如故暴发了变动,变成了0x044becd0
唯独其针对性的值是平等的,所以你把值改了,所以“李四”就出去了。
备注:中间的p和外面的p虽然不一致,可是指向的值是相同的

 

于是乎第一行结果输出:李四

4:最终是 Change(ref p) 函数内部

C# 6

 

重要表达:此间内部的p地址和表面的p地址是平等的,没有产生变化
下一场再一次指向一个新的目标,只是对象的值地址发生了转移。
备考:外部p地址=内部p地址,所以其针对性的值都是新的靶子的值。

 

于是乎第三行结果输出:张三

 

末段结出图如下:

C# 7

 

末尾结言:

 

对于Class类型使用 ref,是为着保持引用的地点是千篇一律的。
故此,不要单独意识到引用类型传地址,值类型传值就截至了,要相对的瞩目到,引用类型传址时,内部传参会爆发一个新地点。
之所以大家在传递类引用时,喜欢在里面使用 new的民工们得小心留心了。

这里似乎也是传参领域的题目,只是附上了 ref

 

 

相关文章