c#

位置:IT落伍者 >> c# >> 浏览文章

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


发布日期:2019年03月17日
 
在.NET程序中正确使用String类型[1]
在实际程序中String类型用得非常广泛然而由于NET对String类型变量的独特管理方式使用不当会严重影响程序的性能我们分几个方面来谈这个问题

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

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

class Program

{

static void Main(string[] args)

{

String s = a;

s = abcd;

}

}

使用NET Framework SDK提供的ildasmexe工具查看生成的MSIL指令

method private hidebysig static void Main(string[] args) cil managed

{

entrypoint

// 代码大小 (xe)

maxstack

locals init ([] string s)

IL_: nop

IL_: ldstr a

IL_: stloc

IL_: ldstr abcd

IL_c: stloc

IL_d: ret

} // end of method Program::Main

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

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

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

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

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

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

String s = a;

s = abcd;

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

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

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

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

请看以下两段代码

) String s = ab;

s+=cd;

) String s=ab+cd

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

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

locals init ([] string s)

IL_: nop

IL_: ldstr ab

IL_: stloc

IL_: ldloc

IL_: ldstr cd

IL_d: call string [mscorlib]SystemString::Concat(string

string)

IL_: stloc

IL_: ret

[] []

               

上一篇:在.NET程序中正确使用String类型[2]

下一篇:C#正则表达式整理备忘(2)