科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道在.NET程序中正确使用String类型

在.NET程序中正确使用String类型

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

    在实际程序中,String类型用得非常广泛,然而,由于.NET对String类型变量的独特管理方式,使用不当,会严重影响程序的性能。我们分几个方面来谈这个问题:   1、了解String数据的内存分配方式   编写一个控制台应用程序。

作者:中国IT实验室 来源:中国IT实验室 2007年10月2日

关键字: 程序 编程

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

    在实际程序中,String类型用得非常广泛,然而,由于.NET对String类型变量的独特管理方式,使用不当,会严重影响程序的性能。我们分几个方面来谈这个问题:

  1、了解String数据的内存分配方式

  编写一个控制台应用程序,输入以下测试代码:

class Program
{
static void Main(string[] args)
{
String s = "a";
s = "abcd";
}
}

  使用.NET Framework 2.0 SDK提供的ildasm.exe工具查看生成的MSIL指令:

01 .method private hidebysig static void Main(string[] args) cil managed
02 {
03 .entrypoint
04 // 代码大小 14 (0xe)
05 .maxstack 1
06 .locals init ([0] string s)
07 IL_0000: nop
08 IL_0001: ldstr "a"
09 IL_0006: stloc.0
10 IL_0007: ldstr "abcd"
11 IL_000c: stloc.0
12 IL_000d: ret
13 } // end of method Program::Main

  简要解释一下上述MSIL指令代码:

  第06句给局部变量s分配一个索引号(索引号从0开始,如函数中有多个局部变量,其索引号按在函数中出现的顺序加一)。

  在编译时编译器会将代码中的两个字串“a”和“abcd”写入到程序集的元数据(metadata)中,此时,这两个字串被称为“字串字面量(string literal)”。

  第08句使用ldstr指令为字串对象“a”分配内存,并将此对象引用压入到线程堆栈中。

  第09句使用stloc指令从线程堆栈顶弹出先前压入的对象引用,将其传给局部变量s(其索引号为0)。

  同样的过程对“abcd”重复进行一次,所以这两句简单的代码

String s = "a";
s = "abcd";

  将会导致CLR使用ldstr指令分配两次内存。

  根据上述分析,读者一定明白了String变量的内容是只读的,给其赋不同的值将会导致内存的重新分配。因此,为提高程序性能,编程时应尽量减少内存的分配操作。

  下面对代码中常见的字串用法进行分析,从中读者可以知道如何避免严重影响程序性能的字串操作。

  2、尽量少使用字串加法运算符

  请看以下两段代码:

  (1) String s1 = "ab";
s1+="cd";

  (2) String s1="ab"+"cd";

  这两段代码运行结果一样,但速度一样快吗?

  请看第(1)段代码生成的MSIL指令:

.locals init ([0] string s1)
IL_0000: nop
IL_0001: ldstr "ab"
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldstr "cd"
IL_000d: call string [mscorlib]System.String::Concat(string,
string)
IL_0012: stloc.0
IL_0013: ret

  再看第(2)段代码生成的指令:

.locals init ([0] string s1)
IL_0000: nop
IL_0001: ldstr "abcd"
IL_0006: stloc.0
IL_0007: ret


 

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章