Posted on 2008-05-06 18:09
Jerson Ju 阅读(100)
评论(0) 编辑 收藏 网摘 所属分类:
C#/DesignPattern
今天心情好,再给大家讲解一个初学者容易迷惑的东西。c# java分原始数据类型和引用数据类型。很显然string 不是原始数据类型,它是个引用类型。但为什么我们写下面这样一段代码,运行结果会与我们想象的不同呢?
using System;
class StringTest
{
public static void change(string str)
{
str = "OK";
}
public static void Main()
{
string strA = "hello";
change(strA);
Console.WriteLine(strA);
}
}
通常我们认为结果是结果是“OK”,但不是的,真正结果是"hello".为什么会这样呢。string 不是传引用的吗?
是的,是传引用的。只是深拷贝和浅拷贝造成的。
平时我们对对象的赋值都是浅拷贝,java c#里默认都是浅拷贝。
如:
A objB = new A();
A obja = objB;
运行完这段代码后,ojba 和 objB两个引用指向了同一块内存。
如果上面的类,如果是深拷贝的话,结果就不同。
先复制一份objB的数据,放入堆内存。objB 和 obja各自指向了一块内存。
正是因为string 是唯一个默认就是深拷贝。
所以我们把strA 传递给change函数的时候,strA先在堆内存中创建了一个数据副本 strA引用指向副本数据内存。
然后 str ="0k";改变的只是副本的引用,所以真的"hello"内存区域没改变。所以打印还是"hello";
如果你具有c++基础,那就很容易理解了。一开始就学c#的,那可能会有点云里雾里。