string 值类型还是引用类型?

string 值类型还是引用类型?

我是菜鸟,讨论的话题当然也只适合菜鸟看了,大虾就飘过吧!

大家先来看一下下面的代码吧!

using  System;
using  System.Collections.Generic;

public   class  MyClass
{
    
public static void Main()
    
{
        
string s="abc";
        
string a=s;
        s
="def";
        Console.WriteLine(
"{0},{1}",a,s);
    }

    
}

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

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


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

using  System;
class  MyClass
{
    
static   void  M( string  s)
    {
        s
= " abcd " ;
    }
    
static   void  Main()
    {
        
string  s = " efgh " ;
        M(s);
        Console.WriteLine(s);
    }
}



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

所以我个人对string的理解是,它是一个引用类型的,只不过是它拥有了值类型的特征!希望不会误导新手。如果有高手知识的更多的话,望不吝指教!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值