作者undyingworld (恒)
看板C_Sharp
标题[问题] pass class instance as value 疑问
时间Tue Sep 19 21:11:07 2017
第一次po文请见谅
我大概知道c# call by value / reference是怎麽回事
但使用上还是觉得怪怪的
在c++中,当我们把传入函式的参数设成传址或传参考,
意味着该值会在函式中被更改
另一方面,如果只是传值使用者不必担心传入的变数会被改掉
但c#中,class object本身就是reference type
不论是传参考或传值都有可能被修改
如果我是class 的使用者,
难道不该(需)知道该物件有没有被修改过吗?
感觉抖抖的
或者说,我该用什麽角度去理解c#对class object的操作呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 203.77.32.131
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1505826669.A.363.html
1F:→ testPtt: 就要自己new物件去复制防止修改阿 09/19 22:00
2F:→ undyingworld: 原来要手动复制呀。也就是说传进去的class物件基本 09/19 23:42
3F:→ undyingworld: 上就变成未知数了 09/19 23:42
4F:推 lightyen: 不需要知道 09/20 00:18
5F:→ lightyen: 因为有public private 09/20 00:19
6F:→ ssccg: 跟C++比的话,就当C#里reference type的都是pointer就好 09/20 00:30
7F:→ ssccg: 想有像C++那种on stack object可以用value type(struct) 09/20 00:31
8F:→ undyingworld: 或许我更在意可读性的问题,一个函式接收class obj 09/20 12:13
9F:→ undyingworld: ect当参数,我怎麽知道这是output 还是input,因为 09/20 12:13
10F:→ undyingworld: 不需要out / ref 关键字就可以修改其值 09/20 12:13
11F:→ undyingworld: 使用struct 的方式无法解决某些情况,例如使用别人 09/20 12:19
12F:→ undyingworld: 写的code,无法自己决定用class或struct,但又必须 09/20 12:19
13F:→ undyingworld: 用到该class object 当参数 09/20 12:19
14F:→ ssccg: C#世界(或是说用这种传参数方法的语言都是)不太会去分input 09/20 13:13
15F:→ ssccg: output参数,你可能得习惯,实际行为看API说明就好 09/20 13:15
16F:→ Litfal: 不懂你的问题,class当参数就是要被使用,一个人传过去变 09/20 16:12
17F:→ Litfal: 另一个人不奇怪吗?真要只传资料请另外开DTO class 09/20 16:12
18F:→ Litfal: 知道物件有没有被修改过?什麽都想知道不就和OO的封装原则 09/20 16:21
19F:→ Litfal: 矛盾了? 09/20 16:21
20F:推 shadow0326: 我想原po的问题大概是C#没有const参数吧? 这只能靠设 09/20 18:42
21F:→ shadow0326: 计模式回避掉 09/20 18:42
22F:→ undyingworld: 感谢各位回应,也许是从c++的角度来看c#才觉得怪怪 09/20 18:51
23F:→ undyingworld: 的,对我来说已经很习惯透过c++的参数型态来判断是 09/20 18:51
24F:→ undyingworld: 否期待该参数会被函式改变,但c#在决定使用class或 09/20 18:51
25F:→ undyingworld: struct的时候就决定好之後只能当作ref或value 使用 09/20 18:51
26F:→ undyingworld: 即使在c++当中没有使用const ,我仍然可以预想传值 09/20 18:54
27F:→ undyingworld: 时原本的物件不会被改变。 09/20 18:54
28F:→ undyingworld: 而会被改变的参数我则认为他是函数的outputs 之一 09/20 18:56
29F:→ undyingworld: 如果传入的所有参数都可能被改变,那我只能透过注 09/20 18:58
30F:→ undyingworld: 解或说明档才能知道哪个是input 哪个是output 09/20 18:58
31F:→ undyingworld: 对我来说这样会降低程式码的可读性和可维护性 09/20 19:00
32F:→ ssccg: 在这边的世界里,反倒是觉得把参数当output是诡异的想法... 09/20 19:09
33F:→ ssccg: 一个物件自己能控制自己能被做哪些操作,不是由caller也不 09/20 19:11
34F:→ ssccg: 是由callee function来决定,是比较纯物件导向的看法吧 09/20 19:12
35F:→ ssccg: 真的常有不想被改的需求的class,通常是准备个immutable版 09/20 19:12
36F:→ ssccg: 的,setter不给用就好了 09/20 19:13