• string 值类型还是引用类型 Timothy


    大家先来看一下下面的代码吧!
    1 using System;
     2 using System.Collections.Generic;
     3 
     4 public class MyClass
     5 {
     6     public static void Main()
     7     {
     8         string s="abc";
     9         string a=s;
    10         s="def";
    11         Console.WriteLine("{0},{1}",a,s);
    12     }
    13     
    14 }

    输出的是abc,def
    我们都知道数组是引用类型的,请看一下段代码:

     1 using System;
     2 class MyClass
     3 {
     4     static void Main()
     5     {
     6         int [] Arr1={1,2,3,4,5};
     7         int [] Arr2=Arr1;
     8         Arr1[1=200;
     9         foreach (int i in Arr2)
    10         Console.WriteLine(i);
    11     }
    12 }

    我们都知道值类型如果附值的时候,是把自己的一个副本附给另一个变量,之后它们互不影响。而引用类型则是把它在堆栈中的地址复制一份给另一个变量,它们的指向仍是一样的,所以当对一个变量进行操作的时候会影响到另外一个变量,所以上例中Arr2[1]=200而不是2。所以我们可以暂且认为string是值类型。
    下面的一段代码再一次说明了它具有值类型的特征。

     1 using System;
     2 class MyClass
     3 {
     4     static void M(string s)
     5     {
     6         s="abcd";
     7     }
     8     static void Main()
     9     {
    10         string s="efgh";
    11         M(s);
    12         Console.WriteLine(s);
    13     }
    14 }

    但实际上string是引用类型的(sorry,我水平有限,没办法证明),引用一下MSDN上的话:“String 对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。看来似乎修改了 String 对象的方法实际上是返回一个包含修改内容的新 String 对象。”
    大家看了这句话是不是有种恍然大悟的感觉了?让我把它说的更通俗点吧“重新赋值,就是在堆中重新分一块内存给它放新的值即重新NEW了一个对象,而不是覆盖原先的值是.而原先的值将等着CG来回收。
    那如果你想定义经常变的字符串,用string类的话,如果CG不能够及时回收,那不是很占用内存吗?
    所以MS推荐了另一个类:System.Text.StringBuilder 类.

    所以我个人对string的理解是,它是一个引用类型的,只不过是它拥有了值类型的特征!

  • 相关阅读:
    在django中,执行原始sql语句
    Django的select_related 和 prefetch_related 函数优化查询
    Django -- settings 详解
    Django-models的字段类型
    ORM
    django-response对象
    spark集群进入 bin 下面目录./spark-shell 出现Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    Hbase启动的时候出现:[RpcServer.handler=28,port=60000] ipc.RpcServer: RpcServer.handler=28,port=60000: exiting,master.HMasterCommandLine: Master exiting
    c++实现写一个函数,求2个整数的和,要求在函数体内不得使用+,-* /
    nutch二次开发环境搭建
  • 原文地址:https://www.cnblogs.com/haiyang1985/p/1752111.html
Copyright © 2020-2023  润新知