C#新人求问传值问题?

linhuanzhi 2016-12-20 10:59:09
C#方法的参数传递有4中类型,其中一个是“传值”。而一般情况下传值方式是不会改变参数的值,但是在某些情况下会改变参数的值,比如下面的程序1:

class Element
{
public int number = 10;
}

class Program
{
static void Change(Element s)
{
s.number = 100;
}

static void Main(string[] args)
{
Element e = new Element();
Console.WriteLine(e.number);
Change(e);
Console.WriteLine(e.number);
}
}

这段程序的输出结果是:
10
100

参数值是发生了改变的。

如果我们再做一下修改,比如下面的程序:2:

class Element
{
public int number = 10;
}
class Program
{
static void Change(Element s)
{
Element t = new Element();
t.number = 100;
s = t;
}

static void Main(string[] args)
{
Element e = new Element();
Console.WriteLine(e.number);
Change(e);
Console.WriteLine(e.number);
}
}

其中只将程序1的Change函数做了修改,输出结果是
10
10

参数的值没有改变。
这两种方式的区别有解释说是程序1的传值方式改变了Element类的对象的域,而不是改变了对象本身。这种解释我不是很明白,程序1和程序2的区别能否有大神帮忙详细分析一下?他们的机理是怎样的?传值过程中发生了什么?
...全文
209 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
也看看值类型跟引用类型对应所在的堆栈关系。
  • 打赏
  • 举报
回复
应8楼的要求。 首先楼主得先去查一下,C#的值类型和引用类型有哪些。 什么叫引用传递?? 简单点说,例如: string hot="avav"; 我的字符串"avav",在东京,那么hot指向的地址在东京。 string bobo=hot,这里hot传给bobo的就是地址,引用的地址。引用传递。 然后你试试改变hot="tokyo hot",看看bobo等于多少。 值传递嘛,例如: int igu=1; int ige=igu; int igu=2;你会发现ige等于1,igu=2。int是值类型,传递的是值, 就是,我的是1,赋给你之后你就是1,我变了跟你没关系,再见。 引用类型的是,告诉你我之前常去的地址了(如一个club),我现在不去了, 你也想跟我一样,那就去我现在常去的那一家。
巴士上的邂逅 2016-12-20
  • 打赏
  • 举报
回复
这个链接很形象的解释了你的这个问题
john_QQ:2335298917 2016-12-20
  • 打赏
  • 举报
回复
引用 7 楼 Seilboy 的回复:
这是值类型和引用类型的问题吗? 你两段代码传参方式是没变的,又没加ref这种东西,所以两种参数都是引用类型 区别在于第二个方法中 new 了一个新对象 这个问题我之前自己考虑过,我的猜测是 引用类型传递过程中形参会有一个新地址B,指向原来对象 第一段代码你把对象一个属性改变了,方法外也会跟着变,因为指向同一个对象 第二段代码B地址指向了新的对象,你再去修改新对象的属性就不会方法外对象的属性值了 如果你加了ref关键字,传过去的就不是新地址,而是真实的地址,所以方法内对形参的任何修改都会影响到方法外 当然,我技术比较差,不会监视内存,暂时猜测是这样,希望得到高人正解 但是你这两段代码,并不是由于值类型和引用类型的差异导致的,这点还是可以确定的
如果理解了引用传递的原理,就会理解这段代码,我说的理解值传递和引用传递,是让提问者从根源上理解这类问题
token不能为空 2016-12-20
  • 打赏
  • 举报
回复
这是值类型和引用类型的问题吗? 你两段代码传参方式是没变的,又没加ref这种东西,所以两种参数都是引用类型 区别在于第二个方法中 new 了一个新对象 这个问题我之前自己考虑过,我的猜测是 引用类型传递过程中形参会有一个新地址B,指向原来对象 第一段代码你把对象一个属性改变了,方法外也会跟着变,因为指向同一个对象 第二段代码B地址指向了新的对象,你再去修改新对象的属性就不会方法外对象的属性值了 如果你加了ref关键字,传过去的就不是新地址,而是真实的地址,所以方法内对形参的任何修改都会影响到方法外 当然,我技术比较差,不会监视内存,暂时猜测是这样,希望得到高人正解 但是你这两段代码,并不是由于值类型和引用类型的差异导致的,这点还是可以确定的
linhuanzhi 2016-12-20
  • 打赏
  • 举报
回复
引用 5 楼 johnliuyuan 的回复:
你得理解值传递和引用传递的原理
我现在理解到的是: 传值方式在方法调用时传递的是参数的一份拷贝,因此改变的是拷贝的值,而不是参数本身的值; 传址方式在方法调用时传递的是参数的内存地址,因此改变的是内存地址所指内存中的参数值,即参数本身的值。 但是我不清楚这里的“域”是个啥意思
john_QQ:2335298917 2016-12-20
  • 打赏
  • 举报
回复
你得理解值传递和引用传递的原理
linhuanzhi 2016-12-20
  • 打赏
  • 举报
回复
引用 2 楼 q18665401 的回复:
首先,你要知道什么是域。
一语中的啊,我不知道这个“域”指的是什么,只知道,哦,原来是改变了“域”,不知道TM到底改变的是啥。。。求大神指点一二
linhuanzhi 2016-12-20
  • 打赏
  • 举报
回复
引用 1 楼 yuankaiwsl 的回复:
这个链接很形象的解释了你的这个问题
这个很有用,能够帮助我理解,谢谢
  • 打赏
  • 举报
回复
首先,你要知道什么是域。

110,571

社区成员

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

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

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