posts - 26, comments - 18, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
      今天心情好,再给大家讲解一个初学者容易迷惑的东西。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#的,那可能会有点云里雾里。


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

相关文章:

相关链接: