文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>.NET 中String 和StringBuilder 以及他们的区别

.NET 中String 和StringBuilder 以及他们的区别

时间:2011-05-04  来源:丘比特

 当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能,为什么呢?最大区别在于他们的内存分配机制不同。

内存分配:

String

String 对象是不可改变的。每次使用 String 类中的方法之一或进行运算时(如赋值、拼接等)时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间

StringBuilder

StringBuilder 实例的 int Capacity 属性,它表示内存中为存储字符串而物理分配的字符串总数。该数字为当前实例的容量。当字符串操作的结果大于当前的容量时,该属性的值会自动增长。增长的幅度为当前数值的2倍。

注: .NET Framework中可变集合类如ArrayList 的Capacity 属性也类似这种自动分配机制

OK 既然说到String 顺便介绍下String对象的引用比较问题

猜猜下面这段代码将会输出什么结果??

     public void Test1()
        {
            string a = "abcd";
            string b = "abcd";
            /**
             * object.ReferenceEquals(object objA, object objB);
             * 返回结果:
             * 如果 objA 是与 objB 相同的实例,或者如果二者都为空引用,则为 true;否则为 false。
             * ***/
            Console.WriteLine(object.ReferenceEquals(a,b));
        }

这段代码将输出

true

是的不信你可以自己验证一下,因为在你代码中定义"abcd" 的时候系统就已经为这个字符串实例分配了内存,这里的"abcd"将作为一个实例对象存储在内存中,在下方又用到了这个字符串,所以系统直接将它的引用赋值给了b变量

 

再来一段,猜猜这个将会输出什么结果?

  public static void Main(string[] args)
        {             string a = "abeqwec";
            string b = "abeqwe" + "c";
            string c = "abeqwec";
            Console.WriteLine(object.ReferenceEquals(a,c));
            Console.WriteLine(object.ReferenceEquals(a,b));
            Console.WriteLine(object.ReferenceEquals(b,c));
            Console.ReadLine(); 
        }
    IL 代码 .method public hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack 2
    .locals init (
        [0] string a,
        [1] string b,
        [2] string c)
    L_0000: nop 
    L_0001: ldstr "abeqwec"
    L_0006: stloc.0 
    L_0007: ldstr "abeqwec"
    L_000c: stloc.1 
    L_000d: ldstr "abeqwec"
    L_0012: stloc.2 
    L_0013: ldloc.0 
    L_0014: ldloc.2 
    L_0015: call bool [mscorlib]System.Object::ReferenceEquals(object, object)
    L_001a: call void [mscorlib]System.Console::WriteLine(bool)
    L_001f: nop 
    L_0020: ldloc.0 
    L_0021: ldloc.1 
    L_0022: call bool [mscorlib]System.Object::ReferenceEquals(object, object)
    L_0027: call void [mscorlib]System.Console::WriteLine(bool)
    L_002c: nop 
    L_002d: ldloc.1 
    L_002e: ldloc.2 
    L_002f: call bool [mscorlib]System.Object::ReferenceEquals(object, object)
    L_0034: call void [mscorlib]System.Console::WriteLine(bool)
    L_0039: nop 
    L_003a: call string [mscorlib]System.Console::ReadLine()
    L_003f: pop 
    L_0040: ret 
}

 
由此可见在进行编译为IL代码之前,编译器已经将字符串做了链接,所以对我们的运行结果将不会有影响
以上代码 输出 True  True  True  
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载