前言:
下面有兩個虛擬程式碼
1 | int times = 30000000; |
請問下面這兩段程式碼有沒有差別?
1 | s = $"{times}"; |
$""
這個程式碼是string.Format()
語法糖
如果知道差別的同學,恭喜你已經可以下課了
如果不知道差別也沒關係,讓我細細講述.
String.Format方法簽章
在String.Format
方法有一個重載方法,可以看到裡面吃參數是params object[]
這可以讓我們傳進東西當作參數(他會在方法中呼叫ToString
方法).
1 | public static string Format(string format, params object[] args) |
所以這段程式碼看起來應該是要一樣,但事實並非如此…
1 | s = $"{times}"; |
$”{times}” vs $”{times.ToString()}”
在執行下面程式碼會發現兩段程式碼不管怎麼執行
執行時間$"{times}";
永遠都會比$"{times.ToString()}";
來的多
1 | class Program |
執行時間如上圖
Source Code
這是為什麼呢??
原因出在Boxing和UnBoxing上…
Boxing 和 UnBoxing
在說Boxing
和UnBoxing
之前
我們要了解.Net中的Refer Type
和Value Type
在記憶體存放上差別.
想了解
Refer Type
和Value Type
的人,可以參考我之前寫文章 【C#】 參考類型 , 值類型 Equals方法 和 ==.
假如已經了解Refer Type
和Value Type
,在.Net中有分Stack記憶體區段和Heap記憶體區段.
- Stack:存放Value Type(struct)資料
- Heap:存放Refer Type資料
Boxing
因為在Boxing時我們會把Value Type
資料複製一份資料到Refer Type
記憶體中.
1 | int i=20; |
上面程式碼大概會如下圖操作
int強制轉型為object 因為我們所有物件都是繼承於object物件
UnBoxing
至於UnBoxing
動作就如下面程式碼
1 | int i=20; |
UnBoxing
會將原本存在Heap的值,會把他搬回Stack並附值給J
o Object
強轉成int
在這個案例不會有問題,但如果是將o
轉為char
就會有問題
(解答)String.Format兩個範例 效能差異
如果有從頭看到尾小夥伴,相信應該可以了解到問什麼會有沒有.ToString
會造成差異性了吧.
因為Boxing
會造成系統無形中消耗,如果我們先把傳入Value Type
資料轉成String
再傳入就可以避免Boxing
問題.
此文作者:Daniel Shih(石頭)
此文地址: https://isdaniel.github.io/stringformat-compare/
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 3.0 TW 許可協議。轉載請註明出處!