在.NET程序中正確使用String類型
2006/12/15 23:17:10
在實際程序中,String類型用得非常廣泛,然而,由于.NET對String類型變量的獨特管理方式,使用不當(dāng),會嚴(yán)重影響程序的性能。我們分幾個方面來談這個問題:
1、了解String數(shù)據(jù)的內(nèi)存分配方式
編寫一個控制臺應(yīng)用程序,輸入以下測試代碼:
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開始,如函數(shù)中有多個局部變量,其索引號按在函數(shù)中出現(xiàn)的順序加一)。
在編譯時編譯器會將代碼中的兩個字串“a”和“abcd”寫入到程序集的元數(shù)據(jù)(metadata)中,此時,這兩個字串被稱為“字串字面量(string literal)”。
第08句使用ldstr指令為字串對象“a”分配內(nèi)存,并將此對象引用壓入到線程堆棧中。
第09句使用stloc指令從線程堆棧頂彈出先前壓入的對象引用,將其傳給局部變量s(其索引號為0)。
同樣的過程對“abcd”重復(fù)進(jìn)行一次,所以這兩句簡單的代碼
String s = "a";
s = "abcd";
將會導(dǎo)致CLR使用ldstr指令分配兩次內(nèi)存。
根據(jù)上述分析,讀者一定明白了String變量的內(nèi)容是只讀的,給其賦不同的值將會導(dǎo)致內(nèi)存的重新分配。因此,為提高程序性能,編程時應(yīng)盡量減少內(nèi)存的分配操作。
下面對代碼中常見的字串用法進(jìn)行分析,從中讀者可以知道如何避免嚴(yán)重影響程序性能的字串操作。
2、盡量少使用字串加法運算符
請看以下兩段代碼:
(1) String s1 = "ab";
s1+="cd";
(2) String s1="ab"+"cd";
這兩段代碼運行結(jié)果一樣,但速度一樣快嗎?
請看第(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
可以很清楚地看到,第(1)段代碼將導(dǎo)致String類的Concat()方法被調(diào)用(實現(xiàn)字串加法運算)。對于第(2)段代碼,由于C#編譯器聰明地在編譯時直接將兩個字串合并為一個字串字面量,所以程序運行時CLR只調(diào)用一次ldstr指令就完成了所有工作,其執(zhí)行速度誰快就不言而喻了!
3、避免使用加法運算符連接不同類型的數(shù)據(jù)
請看以下代碼:
String str = "100+100=" + 200;
Console.Writeline(str);
生成的MSIL指令為:
.maxstack 2
.locals init ([0] string str)
IL_0000: nop
IL_0001: ldstr "100+100="
IL_0006: ldc.i4 0xc8
IL_000b: box [mscorlib]System.Int32
IL_0010: call string [mscorlib]System.String::Concat(object,
object)
IL_0015: stloc.0
IL_0016: ldloc.0
IL_0017: call void [mscorlib]System.Console::WriteLine(string)
IL_001c: nop
IL_001d: ret
可以清晰地看到,這兩句C#代碼不僅導(dǎo)致了String類的Concat()方法被調(diào)用(IL_0010),而且還引發(fā)了裝箱操作(IL_000b)!
Concat()方
下一頁
返回列表
返回首頁
主站蜘蛛池模板:
久久精品男人影院|
向日葵app在线观看免费下载视频|
blacked欧美一区二区|
日产亚洲一区二区三区|
五月天在线婷婷|
欧美波霸影院在线观看|
免费播看30分钟大片|
老湿机香蕉久久久久久|
国产在线拍偷自揄拍无码|
在线观看免费视频资源|
在线播放无码高潮的视频|
一个人看的视频在线|
无码专区HEYZO色欲AV|
久久精品国产亚洲|
国产精品婷婷久青青原|
国产调教视频在线观看|
h无遮挡男女激烈动态图|
成年女人免费视频播放77777|
久久精品国产69国产精品亚洲
|
国产精品视频网|
a级毛片100部免费观看|
很黄很污的视频网站|
中文字幕色综合久久|
日本网址在线观看|
乱人伦精品视频在线观看|
欧美日韩色黄大片在线视频
|
老司机在线精品|
国内精品伊人久久久久AV一坑
|
日本xxx在线|
久久青草免费91线频观看不卡|
欧美军同性videosbest|
亚洲欧洲自拍拍偷午夜色|
特级无码a级毛片特黄|
国产在线jyzzjyzz免费麻豆|
欧美欧洲性色老头老妇|
国产精品伦子一区二区三区|
80s国产成年女人毛片|
尾野真知子日韩专区在线|
中文字幕永久免费|
无码夫の前で人妻を侵犯|
久久久久无码国产精品不卡|