关于string的传递

getoneking 2008-06-30 11:54:05
public static void convertString(String str)
{
str = "Changed string";
}
static void Main(string[] args)
{
String str = "no changed string";
convertString(str);
Console.WriteLine(str);
}
为什么呢?输出的是no changed string 这样看来参数是值传递,我加上ref关键子输出就是Changed string了,
请问这个string是如何存储的呢?我觉得string是个对象,传递的应该是引用呀...
哪位大哥大姐可以为我详细的讲演一下?不胜感激!
...全文
119 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tinalucky 2008-06-30
  • 打赏
  • 举报
回复
String是引用类型不是值类型
我姓区不姓区 2008-06-30
  • 打赏
  • 举报
回复
要注意对象的作用域

public static void convertString(ref String str)
{
str = "Changed string";
}
bj981 2008-06-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yutian130 的回复:]
加上out

public static void convertString(out string str)
{
str = "Changed string";
}
static void Main(string[] args)
{
String str = "no changed string";
convertString(out str);
Console.WriteLine(str);
}
[/Quote]

输出 "changed string",
加上out执行后要返回的,所以
Console.WriteLine(str);
的值为"changed string"
yutian130 2008-06-30
  • 打赏
  • 举报
回复
加上out

public static void convertString(out string str)
{
str = "Changed string";
}
static void Main(string[] args)
{
String str = "no changed string";
convertString(out str);
Console.WriteLine(str);
}
getoneking 2008-06-30
  • 打赏
  • 举报
回复
谢谢楼上的拉,不过
"每次重新赋值引用地址都会改变,原来的地址就放入垃圾回收,所以才有StringBuilder提高效率"
这句话得意思还不太明白
bj981 2008-06-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 getoneking 的帖子:]
public static void convertString(String str)
{
str = "Changed string";
}
static void Main(string[] args)
{
String str = "no changed string";
convertString(str);
Console.WriteLine(str);
}
为什么呢?输出的是no changed string 这样看来参数是值传递,我加上ref关键子输出就是Changed string了,
请问这个string是如何存储的…
[/Quote]

string是引用类型来的。
因为你在:
public static void convertString(String str)
{
str = "Changed string";
}
这里又用相同的名称str作为接收参数,所以
str = "Changed string"; ’执行后覆盖了你在main函数传来的
值"no changed string",不加ref你当作普通的传值行了
这里的str与main的str两个是不同的地址来的。
加上ref后,就是地址传值了
就如:string 与stringbuilder在字符累加也是不同的。
string是新建一个地址进行字符连接的,每次加上一个字符,都会分配一个地址空间进行存储。
strinbbuilder则不同。在原来的基础上加的,所以速度极快。
wdgphc 2008-06-30
  • 打赏
  • 举报
回复
public static string convertString(String str)
{
str = "Changed string";
return str;
}
static void Main(string[] args)
{
String str = "no changed string";
convertString(str);
Console.WriteLine(str);
}
xhan2000 2008-06-30
  • 打赏
  • 举报
回复
String 是特殊引用类型

每次重新赋值引用地址都会改变,原来的地址就放入垃圾回收,所以才有StringBuilder提高效率

ref关键字可以强制值类型传地址
badtank 2008-06-30
  • 打赏
  • 举报
回复
你这里是传值,不是传址。
根据作用域的因素,convertString中变化的内容是不是作用于外部区域的。
贫僧又回来了 2008-06-30
  • 打赏
  • 举报
回复
因为引用的不是同一个地址啊!
赵一一 2008-06-30
  • 打赏
  • 举报
回复
public static string convertString(String str)
{
str = "Changed string";
return str;
}
里面的参数是值引用,不是地址引用;
应改为
public static string convertString(ref String str)
{
str = "Changed string";
return str;
}
BillMhw 2008-06-30
  • 打赏
  • 举报
回复
public static string convertString(String str)
{
str = "Changed string";
return str;
}
里面的参数是值引用,不是地址引用;
应改为
public static string convertString(ref String str)
{
str = "Changed string";
return str;
}

110,545

社区成员

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

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

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