关于string类型的引用类型一点基础问题~

zoom3000s 2008-02-24 05:14:27
C#中所有的string类型变量都是引用类型的。但我不明白了,如果一个方法接收一个string参数那么,我接收的是这个字符串本身,还是这个string字符串存放的内存地址? 请看下面示例

class Program
{
static void Main()
{
string x ="abc";
Test(x);
Console.WriteLine(x);
}
static void Test(string y)
{
y = "123";
}
}
输出结果是
abc

我的问题是,既然string类型是引用类型的,那么输出的结果应该是123,因为传递到Test()的是字符串x的地址。我觉得,这有点和string是引用类型的说法自相矛盾了。
小弟初学,有什么不对的地方请大伙多多指教。
...全文
106 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
vrhero 2008-02-24
  • 打赏
  • 举报
回复
这个问题跟string类型是不是引用类型一点关系都没有...

如果在为方法声明参数时未使用 ref 或 out,则该参数可以具有关联的值。可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值。通过使用方法参数关键字,可以更改这种行为。
------MSDN

这是很基础的问题...多看书...多看MSDN...
APS_Engine 2008-02-24
  • 打赏
  • 举报
回复
6楼说法强于7楼
zoom3000s 2008-02-24
  • 打赏
  • 举报
回复
class Test
{
public static void Main()
{
string strTest = "123";
Msg(strTest);
Console.WriteLine(strTest);

Console.ReadLine();
}

public static void Msg(string str)
{
str = "456";
Console.WriteLine(str);
}
}

输出结果是:456
123

解答如下:

string是一个特殊的引用类型,它实际上是一个字符串池,string strTest = "123",其实在堆上strTest

中存的是字符串123的引用,当调用Msg方法时,strTest作为参数传递给 str,这个时候只是对strTest做

了一个临时的拷贝,使strTest指向字符串456,此时做的修改只是对引用的修改并 没有修改对象本身,

所以输出的时候还是原来那个对象的值。
zoom3000s 2008-02-24
  • 打赏
  • 举报
回复
刚查资料了。string字符串的问题已经基本明白了。说string字符串时引用类型,其实指的是每一个字符串都是引用的计算的字符串池。比如,string x = "abc"; 意思就是 string x 从字符串池里找出"a","b","c"三个字符拼成x的字符串。string x引用的是字符串池"a","b","c"的地址。所以说string是引用类型的。
其实我们大家使用起来string类型就是按值类型(与值类型使用起来相似)。
zoom3000s 2008-02-24
  • 打赏
  • 举报
回复


class A{
public int Data=10;
}
class Program
{
static void Main()
{
A x =new A();
x.Data=20;
Test(x);
Console.WriteLine(x.Data);
}
static void Test(A y)
{
// y = new A(); 我注释掉2楼的这行代码。
y.Data = 100; //我新增的一行代码
}
}



我把2楼的代码修改一下,运行结果就变成100了。不知我现在理解对不对,string会自动隐含的new出自己的实例。不知道我这么想对不对,还是有什么更官方正正确的说法?谢谢大伙。
Error_Code 2008-02-24
  • 打赏
  • 举报
回复

static void Test(out string y)
{
y = "123";
}


这样应该也OK
wsxqaz 2008-02-24
  • 打赏
  • 举报
回复
所以才会有stringbulid这个东西
zoom3000s 2008-02-24
  • 打赏
  • 举报
回复
哦。谢谢楼上的,我看了你的代码,好像开点窍了。string是引用类型的,但当它被当作参数传递到一个方法中后,当你在方法中给string这个形参赋值的时候,其实是等于实例化了一个这个string的实例。
不知道,我这么想对不对。大家还有什么看法都踊跃发言阿。
he_8134 2008-02-24
  • 打赏
  • 举报
回复
class A{
public int Data=10;
}
class Program
{
static void Main()
{
A x =new A();
x.Data=20;
Test(x);
Console.WriteLine(x.Data);
}
static void Test(A y)
{
y = new A();
}
}

111,115

社区成员

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

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

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