.net里面对象不是引用呢?什么时候是引用什么时候不是?

wumin940590725 2015-02-06 04:04:23

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
person p = new person();
p.age = 13;
setage(p);
Console.WriteLine(p.age);//p.age=12;
Console.Read();
}
static void setage(person p)
{
p.age = 12;
p = new person();
p.age = 15;
}
class person { public int age;}
}
}

请问为什么不是15啊?
...全文
126 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wumin940590725 2015-02-09
  • 打赏
  • 举报
回复
引用 16 楼 Z65443344 的回复:
在c++里面int* p=new int[5];将p传递到函数中如果修改了p的指向,p=new int[n];那么p就改变了,而原来new的内存就需要等到程序结束才能释放,那么请问net里面的p为什么不是这样?
於黾 2015-02-06
  • 打赏
  • 举报
回复
实例是唯一的,引用是不唯一的 手机只有1个,当然你也可以从店里买多个手机把它实例化多次 但是同一个手机本身就只有1个 可以很多人去操作它,把它拿在手里
wumin940590725 2015-02-06
  • 打赏
  • 举报
回复
引用 11 楼 Z65443344 的回复:
上面问题
本拉灯 2015-02-06
  • 打赏
  • 举报
回复
你可以这么理解吧 person p = new person(); p.age = 13; setage( p); 这里的P在编译后IL里会变成 person tmp=p.Clone(); 然后 setage(tmp)入栈 相当于里面的new 只是改变了tmp Console.WriteLine(p.age);//p.age=12; Console.Read();
wumin940590725 2015-02-06
  • 打赏
  • 举报
回复
这个关联堆和栈什么地方吗?new是堆,普通声明是栈,没什么关系吧
wumin940590725 2015-02-06
  • 打赏
  • 举报
回复
引用 9 楼 Z65443344 的回复:
00000
p是引用变量。 加了ref就相当于将函数中的p和get(p)里面的这个p相关连了,对吧 这两句话对吗?
於黾 2015-02-06
  • 打赏
  • 举报
回复
是引用类型,不是引用变量 就是我的手,它本身并不是手机,你放什么手机在我手上,我就引用了什么手机 当然可以多个人都引用同一个手机,也就是多个人都对同一个手机进行操作 具体定义自己百度一下就有了,堆和栈的区别,可能会比较枯燥难懂
wumin940590725 2015-02-06
  • 打赏
  • 举报
回复
p是引用变量。 加了ref就相当于将函数中的p和get(p)里面的这个p相关连了,对吧
於黾 2015-02-06
  • 打赏
  • 举报
回复
还拿手机做例子 假如我是修手机的 我用p表示我当前操作的手机 一开始你把手机给了我,那么p就是你的手机 我new了一下,就是我新买了个手机,我现在手上拿的是自己的手机 你再看你的手机,那跟我手上拿的没有任何关系 而如果加了ref,表示我返回给你我手上拿的手机,而不管这个手机到底从哪来的
wumin940590725 2015-02-06
  • 打赏
  • 举报
回复
引用 5 楼 Z65443344 的回复:
嗯,这个p是不是叫引用变量?如果是是的话请问为什么叫引用变量可以说一下吗 (ps:就是和ref的区别)
本拉灯 2015-02-06
  • 打赏
  • 举报
回复
引用 4 楼 wumin940590725 的回复:
[quote=引用 2 楼 Z65443344 的回复:] static void setage(person p) { p.age = 12; p = new person(); p.age = 15; } 红色的代码,把p指向了新的引用,赋值的是新实例的age属性 跟你传递进来的实例没有任何关系
按照这句话把p指向另外一个实例,那么p其实就被改变了实例,最后输出不应该是另一个实例的参数而不是原实例的参数吗?[/quote] 。。。很多人没搞明白。 setage(person p) 这个到底传的是啥,在C#里面这个只是传的是外面P的一个副本,而不是P本身自己的 可以这么理解吧 static void Main(string[] args) { person p = new person(); 这里的P实列了 p.age = 13; setage(p); 这把生成了同样的一个P的副本 专了进去,注意是副本不是指针 相当于另一个P ,P的副本都指向了同一个堆里的内存 Console.WriteLine(p.age);//p.age=12; Console.Read(); } static void setage(person p) { p.age = 12; p = new person(); 然后这里的P的副本又给new 重新指向 一个内存。并不影响外面的原来的P p.age = 15; }
於黾 2015-02-06
  • 打赏
  • 举报
回复
换成值类型不知道你是否能理解 void s(int i) { i=2; } int a=1; s(a); print(a); 在函数里不管你把i变成什么,都跟a没有关系,只不过是一开始把a的值传递给i了而已 而你的p也是类似的 你换种写法,不要都叫p,比如函数里叫static void setage(person p1) 那么一开始是把p的引用给了p1,你操作p1就相当于操作p new过之后,p1跟p没有关系了,而你依然输出的p,而不是p1
於黾 2015-02-06
  • 打赏
  • 举报
回复
p是个局部变量啊 本来应该是从外部传递进来,然后这个局部变量是引用类型,所以它指向了你传递进来的对象 而new了之后,这个局部变量指向了新对象了,你输出的是原来的对象,而不是输出的p
wumin940590725 2015-02-06
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
static void setage(person p) { p.age = 12; p = new person(); p.age = 15; } 红色的代码,把p指向了新的引用,赋值的是新实例的age属性 跟你传递进来的实例没有任何关系
按照这句话把p指向另外一个实例,那么p其实就被改变了实例,最后输出不应该是另一个实例的参数而不是原实例的参数吗?
於黾 2015-02-06
  • 打赏
  • 举报
回复
如果想返回值是15 你需要这样 static void setage(ref person p) 其实就好比你把手机拿去修理 不管手机里的零件怎么换,系统刷机了没有,最后还是返回给你原来的手机 new就相当于把手机放一边,去操作另一个手机,店主对新手机做了什么都跟你原来的没关系 而使用了ref,则即使换了新手机,也把新的还给你,旧的被扔掉了
於黾 2015-02-06
  • 打赏
  • 举报
回复
static void setage(person p) { p.age = 12; p = new person(); p.age = 15; } 红色的代码,把p指向了新的引用,赋值的是新实例的age属性 跟你传递进来的实例没有任何关系
於黾 2015-02-06
  • 打赏
  • 举报
回复
值类型 引用类型 值传递 引用传递 先把这4个概念搞清楚,就没有疑问了

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧