关于值类型和引用类型

libetywei 2010-11-19 11:29:40
根据值类型和引用类型的区别,当作为函数参数传递的时候.
值类型是把自己的值复制一份传递给别的函数操作.无论复制的值怎么被改变.其自身的值是不会改变的
而引用类型是把自己的内存地址传递给别的函数操作.操作的就是引用类型值的本身.所以值被函数改变了.

如下代码:

public void Add(int x)
{
x += 10;
}

public void Add(string str)
{
str = "新值";
}

string a = "原值";
int b = 0;
Add(b);
Add(a);
Response.Write("a:" + a + "|b:" + b);


上面输出应该为: a:新值|b:0
但实际输出的是:a:原值|b:0

这是为什么呢




...全文
176 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
机器人 2010-11-20
  • 打赏
  • 举报
回复
并没有影响到方法外部的引用 >>> 这句话有必要参看 vrhero 的 blog,没说到点子上,认错
机器人 2010-11-20
  • 打赏
  • 举报
回复
机器人 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 vrhero 的回复:]
错误的解释...你明白就傻了...
[/Quote]

什么地方有误?请教

str = "xxxx"

的确是指向了新的引用。。。
vrhero 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 libetywei 的回复:]
引用 9 楼 fangxinggood 的回复:
一直在强调string是特殊的引用类型~~

因为 string str = "xxxx" 这句话别不是直接修改原引用地址里的内容,
而是自己创建了一个新的引用。在方法作用域内指向了一个新的地址。
并没有影响到方法外部的引用。


明白,结了
[/Quote]
错误的解释...你明白就傻了...
libetywei 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fangxinggood 的回复:]
一直在强调string是特殊的引用类型~~

因为 string str = "xxxx" 这句话别不是直接修改原引用地址里的内容,
而是自己创建了一个新的引用。在方法作用域内指向了一个新的地址。
并没有影响到方法外部的引用。
[/Quote]

明白,结了
vrhero 2010-11-19
  • 打赏
  • 举报
回复
机器人 2010-11-19
  • 打赏
  • 举报
回复
一直在强调string是特殊的引用类型~~

因为 string str = "xxxx" 这句话别不是直接修改原引用地址里的内容,
而是自己创建了一个新的引用。在方法作用域内指向了一个新的地址。
并没有影响到方法外部的引用。

机器人 2010-11-19
  • 打赏
  • 举报
回复
你的Add方法和下面的做法是一样的:

class Student
{
public string Name {get; set;}
}

var s = new Student() { Name="原值" };

void Modify(Student student)
{
student = new Student() { Name="新值" };
}

但实际你想要

void Modify(Student student)
{
student.Name = "新值";
}
libetywei 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuyazhe 的回复:]
public void Add(string str)
这里传递是引用没错。str引用的是字符串"原值",而不是你的变量a
public void Add(ref string str)
这里的str引用的是你传递的变量a,而不是"原值"

你明白了么?
[/Quote]

用来 ref 关键字的话,Add(ref int b) 调用后,b的值也一样会变的,这样并没有解释到值类型和引用类型的区别
Ghost_Khz 2010-11-19
  • 打赏
  • 举报
回复
额。 这么慢。
机器人 2010-11-19
  • 打赏
  • 举报
回复
string是比较特殊的引用类型。。。

str = "新值";

这一句,你就看成是和

str = new string("新值");

一样的。参数str在Add方法里指向了一个新的引用,而没有直接修改到调用方引用的内容。
string是比较特殊的,它在堆上有个拘留池,所有"...."的写法都是一个新的实例,除非内容相同。

兔子-顾问 2010-11-19
  • 打赏
  • 举报
回复
public void Add(string str)
这里传递是引用没错。str引用的是字符串"原值",而不是你的变量a
public void Add(ref string str)
这里的str引用的是你传递的变量a,而不是"原值"

你明白了么?
jshi123 2010-11-19
  • 打赏
  • 举报
回复
a就是"原值"啊,赋值后没有变过,怎么会变成"新值"?

110,545

社区成员

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

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

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