String类型 在底层剖析

一、String在任何语言中,都有它的特殊性,在.NET中也是如此。它属于基本数据类型,也是基本数据类型中唯一的引用类型。字符串可以声明为常量,但是它却放在了堆中。 在.NET中String是不可改变对象,一旦创建了一个String对象并为它赋值,它就不可能再改变,也就是你不可能改变一个字符串的值。

using System;

namespace Demo1
{
    ///<summary>  
    /// String连接测试 
    /// </summary> 
    public class Test
    {
        public static void Main(string[] args)
        {
            string a = "1234";
            Console.WriteLine(a);
            a += "5678";
            Console.WriteLine(a);
            Console.ReadLine();
        }

    }
}

运行的结果:  1234     12345678    

看起来我们似乎已经把MyStr的值从“1234”改为了“12345678”。事实是这样的吗?

实际上并没有改变。在string a = "1234";代码中创建了一个String对象它的值是“1234”,MyStr指向了它在内存中的地址;

第a += "5678";代码中创建了一个新的String对象它的值是“12345678”,MyStr指向了新的内存地址。

这时在堆中其实存在着两个字符串对象,尽管我们只引用了它们中的一个,但是字符串“1234”仍然在内存中驻留。

二、引用类型  

using System;

namespace Demo2

{
    /// <summary> 
    /// String引用类型测试  
    /// </summary>  
    public class Test
    {
        public static void Main(string[] args)
        {
            string a = "1234";
            Console.WriteLine(a);
            Test.Change(ref a);
            Console.WriteLine(a);
            Console.ReadLine();
        }

        public static void Change(ref string s)
        {
            s = "5678";
        }
    }
}
运行结果:  1234   5678 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值