首页 > 学院 > 开发设计 > 正文

ref 的贞操

2019-11-17 03:25:03
字体:
来源:转载
供稿:网友

ref 的贞操

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; } }}

  打印结果:

1shit1shit23ref new myclass

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

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表