C#中string类型复制问题

Jackator 2011-04-28 10:21:33
我们都说string类型是内置引用类型
但是在做复制的时候却怎么是深度复制

举个例子
namespace Copy_string
{
class Test_instance
{
public String data;

public Test_instance(string newData)
{
data = newData;
}
public object GetCopy()
{
return MemberwiseClone();
}
}

class Program
{
static void Main(string[] args)
{
Test_instance source = new Test_instance("dage");
Test_instance target = (Test_instance)source.GetCopy();
Console.WriteLine(target.data);

source.data = "xiaodi";
Console.WriteLine(target.data);

Console.WriteLine("sucess...");
Console.ReadKey();
}
}
}

结果都是
dage
dage

我觉得应该是dage,xiaodi吧,这是为什么呢?求教,问题有点基础
...全文
422 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
remember_me 2011-04-30
  • 打赏
  • 举报
回复
string类型为一个特殊的引用类型。
它叫引用类型,但是表现出的性质却是值类型。
Icedmilk 2011-04-28
  • 打赏
  • 举报
回复
没觉得string有什么特殊的

所有的引用都这副德性,你给他赋值并不会对他原来的对象有什么影响,只是让他指向另外一个对象
isjoe 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jackator 的回复:]
7楼所说的
"C#中的string是一个特殊的引用类型,是一个常量引用,一旦赋值就不可在更改了,
二次赋值只会返回一个新的引用地址,原始引用就被废弃了。"
不知道大家是不是也是这么认为的?
我想知道根据在哪或者有据可查
[/Quote]

忘记了,是一本是。net书中所讲
而且string还有一个特点,就是相同的串内容,不同的对象会返回同一引用地址
蛤十一 2011-04-28
  • 打赏
  • 举报
回复
MemberwiseClone()是浅表复制,即只复制第一层的对象,如果对象中有对于其他对象的引用,则只复制引用;意思就是你调用GetCopy()后,创建了一个新对象target,他和source中的引用data指向同一个内存地址,你改变了source.data 的值,由于String类型的特殊性,他不会在原地址改,而是创建一个新的string对象,这时target.data还指向原来的地址。 so。。。
Jackator 2011-04-28
  • 打赏
  • 举报
回复
7楼所说的
"C#中的string是一个特殊的引用类型,是一个常量引用,一旦赋值就不可在更改了,
二次赋值只会返回一个新的引用地址,原始引用就被废弃了。"

不知道大家是不是也是这么认为的?
我想知道根据在哪或者有据可查
isjoe 2011-04-28
  • 打赏
  • 举报
回复
C#中的string是一个特殊的引用类型,是一个常量引用,一旦赋值就不可在更改了,
二次赋值只会返回一个新的引用地址,原始引用就被废弃了。
636f6c696e 2011-04-28
  • 打赏
  • 举报
回复
            Test_instance source = new Test_instance("dage");
//Test_instance target = (Test_instance)source.GetCopy();
Test_instance target = source;
Console.WriteLine(target.data);

source.data = "xiaodi";
Console.WriteLine(target.data);

Console.WriteLine("sucess...");
Console.ReadKey();

结果正常啊,getcopy是创建新实例的复制,直接用等号是copy原实例,结果就是一个page一个xiaodi了
Icedmilk 2011-04-28
  • 打赏
  • 举报
回复
你拷贝之后其实两个Test_instance用的是同一个string object

你的纠结之处在于赋值语句
source.data = "xiaodi";
它并不是将两个Test_instance实例共用的那个string做了更改
而仅仅将source.data指向了另外一个object


static void Main(string[] args)
{
Test_instance source = new Test_instance("dage");
// 此时,source.data 指向"dage"
Test_instance target = (Test_instance)source.GetCopy();
// 此时,source.data 指向"dage" target.data 指向"dage"
Console.WriteLine(target.data);

source.data = "xiaodi";
// 此时,source.data 指向"xiaodi" target.data 指向"dage"
Console.WriteLine(target.data);

Console.WriteLine("sucess...");
Console.ReadKey();
}
Jackator 2011-04-28
  • 打赏
  • 举报
回复
我关注的是target的变化
kingdom_0 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mota 的回复:]

是target.data
说错了
你又没打印source.data
[/Quote]+1.
MOTA 2011-04-28
  • 打赏
  • 举报
回复
是target.data
说错了
你又没打印source.data
MOTA 2011-04-28
  • 打赏
  • 举报
回复
你两次打印都是 source.data
- -~string 不做映射的
所有的string 都是复制

110,580

社区成员

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

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

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