ref 的贞操

原文链接:http://www.cnblogs.com/XChWaad/p/ref%e5%80%bc%e5%be%97%e6%b7%b1%e5%85%a5%e7%9a%84%e7%bb%86%e8%8a%82.html

ref 和out的区别就不说了,网上一搜,说的都是这个。

我现在想说一点:很多人都说ref对引用类型是没有意义的。我觉得这句话完全是凭自己的想象说出来的,都不去翻翻书。

MSDN原文是这么说的 “按引用传递值类型(如上所示)是有用的,但是 ref 对于传递引用类型也是很有用的。这允许被调用的方法修改该引用所引用的对象,因为引用本身是按引用来传递的。下面的示例显示出当引用类型作为 ref 参数传递时,可以更改对象本身。”

而他举了个字符串的例子,个人觉得这个例子并不好,因为字符串本身是一个比较特殊的引用类型,例子如下:

class RefRefExample
{
    static void Method(ref string s)
    {
        s = "changed";
    }
    static void Main()
    {
        string str = "original";
        Method(ref str);
        // str is now "changed"
    }
}

我也地ref的这一特征做了一个小测试,代码如下
protected void Page_Load(object sender, EventArgs e)
    {
        myclass myc = new myclass();
        myc.Id = 1;
        myc.Name = "shit";

        Response.Write(myc.Id + "<br>" + myc.Name + "<br>");

        //没有ref 原变量myc的引用对象不会改变
        ModifyMyclass(myc);
        Response.Write(myc.Id + "<br>" + myc.Name + "<br>");

        //有ref 原变量myc的引用对象改变了,引用了新对象
        ModifyMyclass(ref myc);
        Response.Write(myc.Id + "<br>" + myc.Name + "<br>");
    }

    private void ModifyMyclass( myclass myc)
    {
        myc = new myclass();
        myc.Id = 23;
        myc.Name = "new myclass";
    }

    private void ModifyMyclass(ref myclass myc)
    {
        myc = new myclass();
        myc.Id = 23;
        myc.Name = "ref new myclass";
    }

  故意写了一个myclass类作为参数传递

public class myclass
{
    private int id;
    public int Id { get { return id; } set { id = value; } }

    private string name;
    public string Name { get { return name; } set { name = value; } }
}

  打印结果:

1
shit
1
shit
23
ref new myclass

 

很显然,ref对引用类型是有意义的。意义就在于变量本身能不能被改变。没有ref的时候,变量本身是不会被改变的。只能改变变量引用的那个对象。而有了ref,变量本身是可以改变的,当然变量引用的对象更是可以改变了。

所以,由此我也来想象一把:ref 标记的参数传递过程中,没有在栈中声明新的变量,而传递的就是栈原来的变量本身。不知道这样理解是否正确,还忘高手门深入剖析!

 





转载于:https://www.cnblogs.com/XChWaad/p/ref%e5%80%bc%e5%be%97%e6%b7%b1%e5%85%a5%e7%9a%84%e7%bb%86%e8%8a%82.html

上一篇:PHP冒泡排序,选择排序,插入排序


下一篇:关注:Eclipse,转贴eclipse CDT的开发文章