記不清楚今天是為毛點想F12看String.Format的實現源碼了,反正就看到了下圖的鳥東西:
瞬間石化有沒有,StringBuilder還能這麼獲取?
下面的事件也簡單,果斷在StringBuilderCache上面點了F12看源碼(Resharpe真是好東西啊。。。)
首先看到的是這是一個internal的類,怪不得沒見有人這麼寫過呢!
研究一番之後,終於弄清楚這貨是干嘛的了:這個類的作用就是緩存一個StringBuilder對象,給那些並不是要做很多Append操作的地方使用的,我們也看到private const int MAX_BUILDER_SIZE = 360,它內部用來判斷是用緩存的StringBuilder函數新new出來一個的界限閥值是360.
這個類的流程是這樣:
1、調用Acquire方法獲取一個StringBuilder,capacity大於360直接new,否則就用StringBuilderCache.CachedInstance這個ThreadStatic變量,當然之後要清空CachedInstance這個變量以防止線程內連續調用Acquire方法獲得同一個StringBuilder引用。
2、GetStringAndRelease返回最後的string對象,然後緩存StringBuilder到CachedInstance變量上去。
寫了簡單的驗證StringBuilderCache的控制台程序:
最終的結果,可以明顯看到大量調用的優勢:
本文源碼地址:https://github.com/a407121393/MyDotNetTestProj/tree/master/MyTestSln/TestStringBuilderCache
用到的Util類在另一個目錄裡面:https://github.com/a407121393/MyDotNetTestProj/tree/master/MyTestSln/Util