http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 5907|回复: 10

[学生提问] 一道我做错的题目

[复制链接]
发表于 2015-12-9 11:57:16 | 显示全部楼层 |阅读模式
[C#] 纯文本查看 复制代码
namespace _99
{
    public class Person
    {
        public int Age { get; set; }
        public string name { get; set; }
        public Person() {}
        public Person(string iname, int iage) { this.name = iname; this.Age = iage; }

        public void Display()
        {
            Console.WriteLine("name = {0}, age = {1}",this.name, this.Age);
        }

        static public void SendPerosnValue(Person p)
        {
            p.Age = 99;
            p = new Person("argl", 30);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person("Jack", 32);
            p1.Display();
            Person.SendPerosnValue(p1);
            p1.Display();
            Console.ReadKey();
        }
    }



这道题我做错了, 调试结果为。
name = Jack, age = 32
name = Jack, age= 99

类是引用类型啊, 为什么值没有变呢。 传入 ref 参数后调试正常。



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2015-12-9 12:14:07 | 显示全部楼层
我只是路过打酱油的。
发表于 2015-12-9 13:04:42 | 显示全部楼层
引用的含意你知道吗?
p本身是引用类型,可以说p指向了一片内存区域(或者说引用了一片内存区域),所以在任何地方只要对p的成员进行修改,就会影响a。
然而你在方法SendPerosnValue中对形参(传入的p)做了一个赋值操作
[C#] 纯文本查看 复制代码
p = new Person("argl", 30);

,也就是说形参(传入的p)被重新指向另一个地址了(这个可以理解为在SendPerosnValue方法中创建了一个局部变量让形参变量来引用,而局部变量在方法返回的时候就会消失),所以不会影响到方法外的p1,除非使用ref或out关键字,将SendPerosnValue方法外部的p1变成指针的指针
这样才会随之改变

不知道这样讲你能不能理解
发表于 2015-12-9 13:05:53 | 显示全部楼层
因为你调用的方法又重新new了一个对象,你只改变属性是没问题的,这个对象里面的属性值会按照你调用的方法来改变对应的属性值。
发表于 2015-12-9 18:07:14 | 显示全部楼层
你这个是教材上面的题目吗?求推荐。呵呵。
 楼主| 发表于 2015-12-10 00:35:39 | 显示全部楼层
我是MT 发表于 2015-12-9 18:07
你这个是教材上面的题目吗?求推荐。呵呵。

呵呵哒, 一家软件公司笔试题. 无聊编译了下, 突然发现自己错了. ...
真是没学好, 推荐 <你必须知道的.NET>
 楼主| 发表于 2015-12-10 00:40:13 | 显示全部楼层
站长苏飞 发表于 2015-12-9 13:04
引用的含意你知道吗?
p本身是引用类型,可以说p指向了一片内存区域(或者说引用了一片内存区域),所以在 ...

感谢...
指针的指针, C语言没学好, 这一块一直绕不出来.
不过p重新指向new的一片区域后, 局部变量返回后消失, p难道又指回去了吗?
先这么理解, 还得看下内存分配的事情.
不过事实最大, 感谢先.
 楼主| 发表于 2015-12-10 00:59:18 | 显示全部楼层
==> 引用你必须知道的.NET 给我的问题画一个句号.

下面对上述示例的执行过程简要分析一下:首先,string str = "Old String"产生了一个新的string对象,如图表示:
然后执行ChangeStr(aStr),也就是进行引用类型参数的按值传递,我们强调说这里传递的是引用类型的引用值,也就是地址指针;然后调用ChangeStr方法,过程aStr = "Changing String"完成了以下的操作,先在新的一个地址生成一个string对象,该新对象的值为"Changing String",引用地址为0x06赋给参数aStr,因此会改变aStr的指向,但是并没有改变原来方法外str的引用地址,执行过程可以表示为:
因此执行结果就可想而知,我们从分析过程就可以发现string作为引用类型,在按值传递过程中和其他引用类型是一样的。如果需要完成ChangeStr()调用后,改变原来str的值,就必须使用ref或者out修饰符,按照按引用传递的方式来进行就可以了,届时aStr = "Changing String"改变的是str的引用,也就改变了str的指向,具体的分析希望大家通过接下来的按引用传递的揭密之后,可以自行分析。

发表于 2015-12-10 09:18:29 | 显示全部楼层
hijushen 发表于 2015-12-10 00:40
感谢...
指针的指针, C语言没学好, 这一块一直绕不出来.
不过p重新指向new的一片区域后, 局部变量返回 ...

P从来都没有指到别的地方过,又怎么回指回来呢,内部的P量个局部变量,和外面的P1根本就不是一个变量,只是一个同名的局部变量而已。这是从字面上说,底层说就是指针的问题,传的是指阵,所以就只能修改值无法修改指向,只要传指阵的指针才能修改指向。
 楼主| 发表于 2015-12-10 18:07:11 | 显示全部楼层
站长苏飞 发表于 2015-12-10 09:18
P从来都没有指到别的地方过,又怎么回指回来呢,内部的P量个局部变量,和外面的P1根本就不是一个变量,只 ...

哦, 谢谢。
不过局部同名变量不用重新声明么。
这么理解又深刻了下。
你必须知道的.NET对引用传值,对不可变的引用变量string也描述了下, 跟new 其实是一样的
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-5-9 08:46

© 2014-2021

快速回复 返回顶部 返回列表