C#中的string到底是什么类型?

ycpaladin 2009-07-22 07:07:46
加精
先看下面:
class Class1
{
static void StrChange(string str)
{
str = "hellow";
}

static void Main()
{
string str = "123";//申明一个字符串
StrChange(str);//调用方法
Console.WriteLine(str);//输出字符串
}
}

输出的结果是 "123"
string 到底是值类型还是引用类型?
如果是值类型,结果倒还说的过去.但是我记得string 是引用类型啊...难道是我记错了??
如果是引用类型的话.输出的结果应该是: "hellow"
请问这是为什么啊?? 大家帮忙解释一下..谢谢!
...全文
6308 296 打赏 收藏 转发到动态 举报
写回复
用AI写文章
296 条回复
切换为时间正序
请发表友善的回复…
发表回复
msx19901106 2012-08-05
  • 打赏
  • 举报
回复
大家都很强大啊
rczjp 2012-08-02
  • 打赏
  • 举报
回复
不过既然提起了ref,那么把ref也做个参考,结果就一目了然了

static void teststring(ref string s)
{

s += "A1";

}


static void testref(ref List<string> l) //引用类型
{

l.Add("hello");

}

static void Main(string[] args)
{

List<string> l1 = new List<string>();

l1.Add("hi");

testref(ref l1);

l1.ToList().ForEach(n => Console.Write(n + " "));//hi hello



string str = "A2";

teststring(ref str);

Console.WriteLine(str);//A2A1
Console.Read();

}
rczjp 2012-08-02
  • 打赏
  • 举报
回复
我觉得河东河西说的很有道理,其实引用就是指针的外衣,不管语言是怎么进化的还是要归于到编译器是怎么编译和执行的。
ref对于这个帖子其实是没有讨论性的,帖子的目的是想区分string是什么类型,所以把string和一个真正的引用类型做对比就知道了

static void teststring(string s)

{

s += "A1";

}


static void testref(List<string> l) //引用类型

{

l.Add("hello");

}

static void Main(string[] args)

{

List<string> l1 = new List<string>();

l1.Add("hi");

testref(l1);

l1.ToList().ForEach(n => Console.Write(n + " "));//hi hello



string str = "A2";

teststring(str);

Console.WriteLine(str);//A2

}
星小野 2011-09-22
  • 打赏
  • 举报
回复
正解!
string类的最大特点就是不可变性.对字符串的操作,是在另一个副本上,原来的string还在托管堆上没有变.调用结束后,副本的生命周期结束.在GC下次遍历进程中的实例引用时,就会销毁掉.
[Quote=引用 7 楼 oec2003 的回复:]
String 是引用类型 不过是不可变的
对字符串做一些操作 比如大小写的转换 += 实际上是重新创建了一个字符串
这也是为什么在做大量字符串拼接的时候要使用StringBuilder 而不用+=
[/Quote]
easywang369 2011-09-21
  • 打赏
  • 举报
回复
今天正好学到传值和传址,好不容易在CSDN上能完全看懂个问题,第一反应LZ这个例子是传值,不是传址啊,看了前几楼云里雾里,发现看到后面,我还想对了,不过还是菜鸟。
Lucenedonet 2011-08-18
  • 打赏
  • 举报
回复
真经典的,很多人都能给个解释,其实都是不骚不痒的说话,真正理解的真不多。

收益了!
JinJJ1402 2010-09-28
  • 打赏
  • 举报
回复
很有意思
了無痕 2010-09-28
  • 打赏
  • 举报
回复
string 是引用类型。
值类型不可以为null,引用类型可以为null。
在使用C#时,可以使用一个可空类型(这是泛型的一种形式)创建一个值类型,使值类型在这个方面的行为方式类似于引用类型(即可以为null)。
松林迷途 2010-09-16
  • 打赏
  • 举报
回复
学习,这个不错的。
wolfson620 2010-08-24
  • 打赏
  • 举报
回复
this way!All my way!
专爆菜鸟 2010-07-26
  • 打赏
  • 举报
回复
学习。。今天最后1贴
danyaozhuanjia 2010-05-07
  • 打赏
  • 举报
回复
引用类型
ycpaladin 2010-05-06
  • 打赏
  • 举报
回复
结贴这么久了...这个问题还在被继续讨论....
看来..这个问题还真算是一个技术问题...
diegoyu 2010-04-12
  • 打赏
  • 举报
回复
NET中除非显式声明按引用传递,即ref和out关键字,全部是按值传递参数...也就是说在跳出方法时,对参数str本身所做的任何更改都被丢弃,不会改变str本身的值...值类型引用类型都是如此,没有不同...
zs82891879 2010-04-07
  • 打赏
  • 举报
回复
string是引用类型,虽说传的是个地址,但string是个常量无法被修改所以传出的是"123"
qsir123 2010-03-24
  • 打赏
  • 举报
回复
增长知识了~
liss_2009 2010-03-13
  • 打赏
  • 举报
回复
是引用类型啊
jb326609690 2010-01-31
  • 打赏
  • 举报
回复
xue xi xia ~~
brainone 2010-01-28
  • 打赏
  • 举报
回复
明白了。。
xxpp688 2010-01-25
  • 打赏
  • 举报
回复
你学过“out”,“ref”的用法吧
(忘了的话查一下帮助,那儿有out与ref的详解)
string是应用类型;
static void StrChange(string str)但你在这里做了值传递(把str传过来),不过在声明的时候
他依然是应用类型。
加载更多回复(273)

110,499

社区成员

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

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

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