答案是惱人,是也不是。
利用 「GetType().IsValueType」可以檢查物件是否為「實數型別」。
所以檢測出,struct 物件是實數型別。
但傳遞時,卻不是複製一樣的物件,而是傳參,而這傳參是一種唯讀概念。也就是在函式中改動也不會影響原struct物件的內容。
總之,C#把很多物件都作了優化,把許多類別物件都變成傳參,唯有當你修改時才會複製成新物件。
所以函式的參數如果有struct時,用不用ref效能是差不了太多。反而用了ref很容易一個不小心改了資料還沒發現。如果真的很想知道差異,我作了測試。發現使用ref的效能是好上10%,但這差異是跑了3千萬次後,少了0.29秒。
也就是函式帶struct參數並使用ref,每次可省0.00000967毫秒。
結論:函式帶struct參數時,如果不會更動資料,就不要加ref。一來用物理性防呆,二來簡單。
使用ref的函式:public string 我的函式(ref 結構資料 A)
未使用ref的函式:public string 我的函式(結構資料 A)
函式
static public bool 是否為實值型別(object 物件)
{
return 物件.GetType().IsValueType;
}
參考資料
《C# 傳值Call by value、參考Call by Reference 與相等比較》
《[C#][筆記] Value Type (實值型別) vs. Reference Type (參考型別)》
《作法:了解傳遞結構和傳遞類別參考給方法之間的差異》
《[沒有蠢問題] c# 如何分辨 實值型別,參考型別》
《Type.IsValueType Property》
沒有留言:
張貼留言