創作內容

14 GP

【筆記】call type 第一部份

作者:樂小呈│2020-02-23 17:06:06│巴幣:28│人氣:302
筆記 call type 第一部份 (藍色粗體部分是檢查筆記者的回覆

在未主動指定傳直、參考的情況下 C# 會自動指定
value type會自動傳直
reference type會自動(強制?)傳參考,但string除外

正常情況下Function的索引值如果沒有加上ref修飾字就是強制傳值
如果傳入的是類別(Class) 則預設就是傳入參考
array, list 的情況比較特殊,寫在筆記的第2部分

=======================================================
    string s = "a";

    PassStringByValue(s);
    void PassStringByValue(string s)
    {
        s = "b";
    }
    Debug.Log(s); 輸出: a

    PassStringByRef(ref s);
    void PassStringByRef(ref string s)
    {
        s = "b";
    }
    Debug.Log(s); 輸出: b

=======================================================
如果傳入的是類別,則預設就是傳入參考

Class c = new Class() { i = 1 };
Debug.Log(c.i); 輸出 => 1

    PassClass(c);
    void PassClass(Class c)
    {
        c.i = 2;
    }
    Debug.Log(c.i); 輸出: 2

    class Class
    {
        public int i;
    }
=======================================================
用法的對比

    call by value -
    intcalValue = 0;
    calValue = Calculate(calValue);
    print(calValue); 輸出: 10

    int Calculate(int value)
    {
        value += 10;
        return value;
    }
//

    call by reference -
    intcalValue = 0;
    Calculate(ref calValue);
    print(calValue); 輸出: 10

    void Calculate(ref int value)
    {
        value += 10;
    }

同樣的結果,如果需要大量調用,call by reference可以防止記憶體堆積

= 換成現實例子 ======

    假如儲存數據的是一張紙(data paper)

    call by value就是我把data paper複印一份(data paper copy)再給對方
    無論對方對data paper copy做了什麼修改,我的data paper都不會被改動

    而call by reference就是直接把data paper交給對方
    對方如果修改,原本的data paper就會被直接改動

接上面運用
    
    如果我需要對方修改後的數據
    
    call by value的話
    我得再把data paper copy抄回data paper
    而這個過程重複執行的話,會多出好幾份複印的data paper copy (記憶體堆積)
    
    call by reference的話
    我的data pape就直接是修改後的數據了
    即使重複執行多次,也不會出現多的data paper copy (防止堆積)

=======================================================

當你使用CallByValue時
記憶體就會產生一個新的位址來存放跟你傳入參數一樣數值的變數供Function使用
int Calculate(int value)
                       ↑J個

一般情況其實不太需要擔心這些問題 因為這些記憶體占用很少
且C#的GC(資源管理工具)也會自動將這些資源釋放掉

而Function裡建立的區域變數當然也會
但通常也不用太擔心這個問題 同樣C#的GC也會自動將不會再使用的資源給釋放


其他廢話我留在第二部分的最後
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4695152
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:程式|筆記

留言共 5 篇留言

鏡野七罪
厲害 佬

02-23 17:45

樂小呈
不佬02-23 17:54
千羽
佬( ´▽`)

02-23 20:58

樂小呈
還不佬啦><02-23 21:04
千羽
這個可以應用在哪裡啊

02-23 20:59

樂小呈
嗯...防止記憶體堆積,就是避免一堆臨時變量把記憶體吃光02-23 21:06
樂小呈
可以用在需要大量重複調用的Function上02-23 21:07
樂小呈
也算是一種觀念吧02-23 21:08
千羽
喔喔喔懂了( ´▽`)謝謝佬(嘿嘿

02-23 21:26

樂小呈
不佬啦><02-23 21:28
%%鼠 拒收病婿
哦哦哦哦!!!
原來傳入的如果是類別(Class) 就會預設傳入參考。
這個問題我已經想了好幾年了,之前都在想為什麼傳入float之類的變數是傳值,傳入GameObject的方法卻可以對傳入的物件做更動。[e17]

不知道除了C# 還有哪些語言是這樣的。[e17]

說到傳址呼叫,我想到有一個有點像ref修飾詞的"out"。我比較沒有研究,不知道兩者差在哪裡,但用hit偵測時是用out回傳,感覺新奇。[e16]

02-29 15:52

樂小呈
因為return一次只能回傳一個變量
out其實就只是提供function額外的回傳變量02-29 16:58
樂小呈
hit需要回傳有沒有打中(bool),還有ray的資料(raycasthit),所以用out02-29 17:01
我要留言提醒:您尚未登入,請先登入再留言

14喜歡★angus945 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:【紀錄】自製Tile M... 後一篇:【筆記】call typ...

追蹤私訊切換新版閱覽

作品資料夾

aaa1357932大家
各位有空可以來我家看看畫作或聽聽我的全創作專輯!看更多我要大聲說9小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】