[问题] 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