2019年8月14日 星期三

C# struct 是傳值(value)還傳參(reference)?為了效能我要加ref嗎?


答案是惱人,是也不是。
利用  「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

沒有留言:

張貼留言