[問題] pass class instance as value 疑問

作者: undyingworld (恒)   2017-09-19 21:11:07
第一次po文請見諒
我大概知道c# call by value / reference是怎麼回事
但使用上還是覺得怪怪的
在c++中,當我們把傳入函式的參數設成傳址或傳參考,
意味著該值會在函式中被更改
另一方面,如果只是傳值使用者不必擔心傳入的變數會被改掉
但c#中,class object本身就是reference type
不論是傳參考或傳值都有可能被修改
如果我是class 的使用者,
難道不該(需)知道該物件有沒有被修改過嗎?
感覺抖抖的
或者說,我該用什麼角度去理解c#對class object的操作呢?
作者: testPtt (測試)   2017-09-19 22:00:00
就要自己new物件去複製防止修改阿
作者: undyingworld (恒)   2017-09-19 23:42:00
原來要手動複製呀。也就是說傳進去的class物件基本上就變成未知數了
作者: lightyen (lightyen)   2017-09-20 00:18:00
不需要知道因為有public private
作者: ssccg (23)   2017-09-20 00:30:00
跟C++比的話,就當C#裡reference type的都是pointer就好想有像C++那種on stack object可以用value type(struct)
作者: undyingworld (恒)   2017-09-20 12:13:00
或許我更在意可讀性的問題,一個函式接收class object當參數,我怎麼知道這是output 還是input,因為不需要out / ref 關鍵字就可以修改其值使用struct 的方式無法解決某些情況,例如使用別人寫的code,無法自己決定用class或struct,但又必須用到該class object 當參數
作者: ssccg (23)   2017-09-20 13:13:00
C#世界(或是說用這種傳參數方法的語言都是)不太會去分inputoutput參數,你可能得習慣,實際行為看API說明就好
作者: Litfal (Litfal)   2017-09-20 16:12:00
不懂你的問題,class當參數就是要被使用,一個人傳過去變另一個人不奇怪嗎?真要只傳資料請另外開DTO class知道物件有沒有被修改過?什麼都想知道不就和OO的封裝原則矛盾了?
作者: shadow0326 (非議)   2017-09-20 18:42:00
我想原po的問題大概是C#沒有const參數吧? 這只能靠設計模式迴避掉
作者: undyingworld (恒)   2017-09-20 18:51:00
感謝各位回應,也許是從c++的角度來看c#才覺得怪怪的,對我來說已經很習慣透過c++的參數型態來判斷是否期待該參數會被函式改變,但c#在決定使用class或struct的時候就決定好之後只能當作ref或value 使用即使在c++當中沒有使用const ,我仍然可以預想傳值時原本的物件不會被改變。而會被改變的參數我則認為他是函數的outputs 之一如果傳入的所有參數都可能被改變,那我只能透過註解或說明檔才能知道哪個是input 哪個是output對我來說這樣會降低程式碼的可讀性和可維護性
作者: ssccg (23)   2017-09-20 19:09:00
在這邊的世界裡,反倒是覺得把參數當output是詭異的想法...一個物件自己能控制自己能被做哪些操作,不是由caller也不是由callee function來決定,是比較純物件導向的看法吧真的常有不想被改的需求的class,通常是準備個immutable版的,setter不給用就好了

Links booklink

Contact Us: admin [ a t ] ucptt.com