ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ref 的贞操

2019-07-27 15:04:46  阅读:214  来源: 互联网

标签:Name 贞操 myclass myc ref Id 引用


原文链接: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

标签:Name,贞操,myclass,myc,ref,Id,引用
来源: https://blog.csdn.net/weixin_30765475/article/details/97515426

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有