[綜合]無題 無名 ID:0HlMFQ9c 2021/03/11(四) 15:09:13.131 No.21829604 評分:-1, 年:-1, 月:-1, 週:-1, 日:-1, [+1 / -1] 最後更新:2021-03-11 17:32:02
島民 C#救我
List<int> Data
我想在別的CLASS上直接用和修改DATA
如果我用下面這class, 這_listNumber的位置是跟DATA的位置一樣嗎? 所以我怎樣改都是在改DATA吧?
[code]
public class ChangeData
{
private List<int> _listNumber;
public ChangeData(List<int> listNumber)
{
_listNumber = listNumber;
}
}
[/code]
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 15:11:48.999 No.21829639 [aa]
public class ChangeData
{
private List<int> _listNumber;
public ChangeData(List<int> listNumber)
{
_listNumber = listNumber;
}
}
[/aa]
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 15:12:39.351 No.21829647
哈!
無題 無名 ID:s1PPB4d. 2021/03/11(四) 15:15:08.596 No.21829673 自己的作業自己做
再吵就 sudo rm -rf /
無題 無名 ID:EVt6qJNc 2021/03/11(四) 15:16:33.631 No.21829687 用ref就可以了
public ChangeData(ref List<int> listNumber)
{
_listNumber = listNumber;
}
}
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 15:19:22.912 No.21829709
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 15:20:59.911 No.21829725 無題 無名 ID:VajPD5JY 2021/03/11(四) 15:23:23.419 No.21829743
無題 無名 ID:1EGFaBXc 2021/03/11(四) 15:25:05.454 No.21829763 無題 無名 ID:0HlMFQ9c 2021/03/11(四) 15:28:28.361 No.21829796 >>21829763書都只寫參考型 參考型的
都不說得再清楚點 參考型是到底有什麼影響
所以上面的
_listNumber = listNumber;
實際上是_listNumber 把位置 指定與listNumber位置一樣 是嗎
所以改_listNumber的內容跟改listNumber的內容是一樣的
無題 無名 ID:PLWnCws2 2021/03/11(四) 15:29:39.652 No.21829806 無題 無名 ID:1EGFaBXc 2021/03/11(四) 15:35:23.913 No.21829863 >>21829796我只能說軟軟在網站上都列給你看了,裡面也有說明
----
C# 中有兩種類型:參考類型和實值類型。 參考類型的變數會儲存期資料 (物件) 的參考,而實值類型的變數則會直接包含其資料。 使用參考類型時,這兩種變數可以參考相同的物件,因此對其中一個變數進行的作業可能會影響另一個變數所參考的物件。
----
所以才會有另一個課題出現
叫做deep clone
就是不想動到原物件
無題 無名 ID:S/Grmask 2021/03/11(四) 15:46:07.759 No.21829973 List 是一個object
所以你需要用new List<int>() 去創建一個List Object
List<int> Data 是一個object reference
實際上只是保存指向那一個List Object罷了
_listNumber = listNumber 是把那個reference改掉
實際上新的list object 和舊的list object也沒有變化
如果有把這個reference傳出去的話
那邊還是會指著舊的object
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 15:50:25.114 No.21830016 >>21829863書中也是一樣的
"C# 中有兩種類型:參考類型和實值類型。 參考類型的變數會儲存期資料 (物件) 的參考,而實值類型的變數則會直接包含其資料。 使用參考類型時,這兩種變數可以參考相同的物件,因此對其中一個變數進行的作業可能會影響另一個變數所參考的物件。
"
>>儲存期資料 (物件) 的參考
所以"參考"是3小卻沒看懂
然後同一個詞一直說一直說
如果他能轉換一下解說方式
直接說 "參考" 就是物品的存在位置 的話
可能才會懂
不然問什麼是右燒
然後島民解說 右燒就是島上的右燒
右燒會常常在K島出現
所以右燒可以是右燒
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 15:51:55.097 No.21830036 無題 無名 ID:1EGFaBXc 2021/03/11(四) 15:53:05.736 No.21830045 無題 無名 ID:KXg1im2o 2021/03/11(四) 15:55:24.800 No.21830074 >>21829796原PO寫的案子是什麼軟體做什麼用的啊?
在商用上,處理資料都直接用DB(SQL SERVER等)吧?
以前學生時代我也寫過一些EDA的軟體,我只想到EDA的工具會用到這個 = =
無題 無名 ID:KXg1im2o 2021/03/11(四) 15:58:38.402 No.21830108
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 15:59:45.418 No.21830124 無題 無名 ID:KXg1im2o 2021/03/11(四) 15:59:55.169 No.21830125
無題 無名 ID:KXg1im2o 2021/03/11(四) 16:00:31.899 No.21830130
無題 無名 ID:KXg1im2o 2021/03/11(四) 16:01:19.855 No.21830138 無題 無名 ID:0HlMFQ9c 2021/03/11(四) 16:02:37.643 No.21830147
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 16:04:03.034 No.21830157 >>21830138我是試過能跑
才在島上問
因為我擔心跑是能跑
但之後有些因為觀念不正確而出現的bug
累積出來最後卡死
整台機械當掉
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 16:05:41.109 No.21830176
無題 無名 ID:mLp2z2/2 2021/03/11(四) 16:05:52.920 No.21830179 >>21829639這段寫成C++會變成
[aa] class ChangeData
{
private:
List<int> *_listNumber;
public:
ChangeData(List<int> *listNumber)
{
_listNumber = listNumber;
}
}
[/aa]
如果你以前寫C,你應該要看得懂這是什麼意思
如果你看不懂,你應該去喝巴拉刈
無題 無名 ID:S/Grmask 2021/03/11(四) 16:11:32.113 No.21830237 c#的reference 就是c++ 的pointer簡化後再加上garbage collection後生出來的東西
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 16:13:34.697 No.21830265 >>21830179是不是把他的位置傳進去
再讓_listNumber存這位置
所以每次弄_listNumber 時
實際就是在弄listNumber
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 16:15:12.425 No.21830289
無題 無名 ID:mLp2z2/2 2021/03/11(四) 16:16:41.460 No.21830302
無題 無名 ID:S/Grmask 2021/03/11(四) 16:16:49.914 No.21830303 >>21830237public void ChangeData(List<int> listNumber)
實際上就是這樣子
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 16:18:05.193 No.21830321 >>21830237島民
如果在用完這object
不需要了
把_listNumber=null後
要跑GC.Collect();嗎
還是他自動會收垃圾?
無題 無名 ID:KXg1im2o 2021/03/11(四) 16:18:16.237 No.21830323 >>21830157如果試過能跑出「正確的結果」,那就沒什麼好擔心的
問題只在你「試」的過程,有沒有周詳,餵的資料
有沒有儘可能包含了所有可能的狀況
無題 無名 ID:xABmIXgo 2021/03/11(四) 16:20:24.171 No.21830345 你他媽的沒有寫程式這方面的天分
認命一點一輩子都去幹苦力活吧
可以去搬磚也可以去擦油漆
滾~
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 16:20:29.725 No.21830346 無題 無名 ID:0HlMFQ9c 2021/03/11(四) 16:21:55.441 No.21830358 無題 無名 ID:esg00iQg 2021/03/11(四) 16:22:27.184 No.21830363
無題 無名 ID:1EGFaBXc 2021/03/11(四) 16:24:09.381 No.21830376
無題 無名 ID:S/Grmask 2021/03/11(四) 16:25:24.144 No.21830388 >>21830321GC會自動跑
可是你也可以手動跑GC.Collect在合適的時機提前跑
你會Pointer的話你應該也會知道
如果你曾經把_listNumber傳到其他地方去的話
就算你用Changelist把_listNumber的reference改掉
在外邊那個Reference還是會指向舊的_listNumber
比較好的做法是list只在class內用
傳到外邊都用IEnumerable
public class ChangeData
{
private List<int> _listNumber;
public IEnumerable<int> ListNumber => _listNumber;
public ChangeData(IEnumerable<int> listNumber)
{
_listNumber = listNumber.ToList(); //<===這邊會開一個新的List object
}
}
無題 無名 ID:5w9avgWM 2021/03/11(四) 16:25:37.604 No.21830391 C#物件都是參考
沒有實體的
跟Java一樣的思維
之所以會有這種奇怪的設計是因為牠們的思維是這樣的
1.禁止你使用指標,這樣你就不用管理記憶體了
2.發現copy物件的成本太高,但又不想給你用指標,於是物件都天生要用new的,new出來的只能是"參考"
3.最近牠們又發現GC管不到的資源很多,於是增加using搭配Dispose這種用法
說穿了這種語言就是為了不會寫C++的人做出來的
如果所有工程師都能正確使用C++的話就不需要這種語法了
但是這個太難
人難免會犯錯
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 16:26:06.838 No.21830396 >>21830323我擔心的是
所有其他相關機器都會掛在
listNumber 這個list object上
實際項目中
不是List<int> Data 而是 List<device> Data
我是用List<int> Data來跑測試
我怕如果是多弄一份把弄錯了些什麼
之前跟List<device> Data有關聯的東西 全出問題
如果只有一個object 而且一直是在改同一object
那就不用擔心了
無題 無名 ID:PLWnCws2 2021/03/11(四) 16:27:32.029 No.21830412 >>21830346>弄出了兩份List<int> ?
不會 List是按reference傳遞的
除了不可變的string之外不需要擔心這個問題
無題 無名 ID:yGqYZ0g2 2021/03/11(四) 16:29:02.194 No.21830426
不求問
無題 無名 ID:S/Grmask 2021/03/11(四) 16:29:04.693 No.21830428 >>21830412他把整個List當parameter用想要覆蓋上去
這樣是會弄出了兩份List<int>的
無題 無名 ID:mLp2z2/2 2021/03/11(四) 16:32:13.595 No.21830461
>>21830396你可以宣告一個List<Test>
然後在Test()跟~Test()裡面都放一行輸出
執行看看Test到底被改了幾次
如果是C++這種信任使用者的語言
你還可以印出Test::this看看他被擺在哪裡
然後在ChangeData裡面也偶爾印一下他追蹤的Test是在哪個位置
讓你更清楚整個程式有沒有照你預期在走
但可惜你用的不是C++,你用的是把使用者當智障處處防範的java的山寨品
所以你大概沒辦法印出指標
太苦了
哈
無題 無名 ID:KXg1im2o 2021/03/11(四) 16:32:13.975 No.21830462
>>21830396老實說,我覺得不論你的程式觀念有沒有了解透徹
你在進行「測試」時
還是必須要進行「完整的測試」
也就是說,就算你完全理解也寫出了「位置與資料」你認為
是正確的程式
你還是必須進行餵資料進行「位置與資料這塊有沒有搞錯」的測試
好幾年的工作經驗,給你做參考
無題 無名 ID:1EGFaBXc 2021/03/11(四) 16:33:47.887 No.21830477 >>21830391"說穿了這種語言就是為了不會寫C++的人做出來的"
這個說法不能說你錯
但我很久很久以前在看組合語言<->C/C++的爭論中
也看過一模一樣的對立面
後來
ORM跟SqlCommand之爭也是一樣的對立面
Jquery與原生JS也是一樣的對立面
雙向綁定(Angular,reactjs..)與Jquery也是一樣的對立面
所以爭這個沒有啥意義,時代和需求的演變罷了
無題 無名 ID:2unWTy3g 2021/03/11(四) 16:34:20.904 No.21830484
>>21830346對於一串資料來說 你那個"=" 就是把資料位置跟其它人講而已,所以還是一份
如果你底線那個已經有添加資料,那份會被GC回收
(我寫純C的)
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 16:34:28.491 No.21830486
>>21830388努力的
但看不懂
因為我還沒學過IEnumerable
自學是看https://codewithmosh.com/ 學的
無題 無名 ID:PLWnCws2 2021/03/11(四) 16:37:27.083 No.21830522
>>21830428List<int>本身就是reference type的 不需要顯式的指定ref
你被C++的pointer思維影響了
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/reference-types
無題 無名 ID:U7Qli1lo 2021/03/11(四) 16:38:45.239 No.21830534
無題 無名 ID:FJ/PUVJc 2021/03/11(四) 16:39:06.619 No.21830539 會怕就用迴圈一個一個塞進去啊
都用C#了想必不是什麼追求效率的程式
快速開發的意思就是要你在時間內拉出一坨屎給業務出去賣
不是要你在時間內掌握所有軟硬體的奇技淫巧把程式打造成藝術品
所以不用去思考太低階的東西迫害自己的腦細胞
GC的語言就是自己爽就好 剩下的交給GC幫你把屎把尿
無題 無名 ID:5w9avgWM 2021/03/11(四) 16:40:39.757 No.21830553 >>21830477站在老闆的立場
一個處處防呆的語言會比較容易寫、開發比較快
也就意味著可以開比較低的薪資來請工程師
同時也比較能輕易開除員工
不怕被工程師技術綁架
一切都跟成本有關
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 16:41:47.079 No.21830565
無題 無名 ID:S/Grmask 2021/03/11(四) 16:41:48.049 No.21830566 無題 無名 ID:5w9avgWM 2021/03/11(四) 16:42:50.332 No.21830584
無題 無名 ID:mLp2z2/2 2021/03/11(四) 16:49:19.939 No.21830668 無題 無名 ID:0HlMFQ9c 2021/03/11(四) 16:53:37.718 No.21830722
謝謝島民
我愛你們
給你們襪子
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 16:54:08.076 No.21830727
無本文
無題 無名 ID:S/Grmask 2021/03/11(四) 16:56:09.901 No.21830752 >>21830668Method的話你實際使用你會先new List<>()再傳去當Parameter啊
把自己傳進去也沒有意義的
無題 無名 ID:0HlMFQ9c 2021/03/11(四) 17:07:43.855 No.21830892
>>21830752所以METHOD的話 _listNumber要先NEW才能用
形成是兩份的意思嗎?
而Constructor _listNumber不用new
能直接拿去存listNumber的位置
這樣?
無題 無名 ID:mLp2z2/2 2021/03/11(四) 17:15:01.936 No.21830976 無題 無名 ID:NP.ByDNw 2021/03/11(四) 17:19:04.542 No.21831021 真的不用討論太深啦
今天程式要求Real-time?
今天程式是跑在嵌入式系統?
都不是? 那你管那麼多幹嘛
你會在意scanf()實際上怎麼呼叫嗎?
你會在意JVM是怎麼實作GC嗎?
一定不會嘛 這種事情好麻煩喔干我屁事
給那些寫C/C++的精障效率廚搞就好了啊
不懂就直接土炮精神硬幹到底
說實話你主管跟老闆也沒那種閒情逸致去看你到底寫了什麼狗屎出來
說不定還會反過來把你負責的部分加速多少%當成績效咧
無題 無名 ID:Ce1hTuUI 2021/03/11(四) 17:19:50.994 No.21831030
無題 無名 ID:Ce1hTuUI 2021/03/11(四) 17:21:31.412 No.21831056 無題 無名 ID:Ce1hTuUI 2021/03/11(四) 17:27:53.221 No.21831153 >>21829604然後你的問題其實超單純,就是你看不懂語法,不是機器那種,是表述的方式
就只是list紀錄在當前的obj上
後續處理時就是那個list
習慣上我們會設定成readonly,加強表述,也避免有c++轉來的天才亂搞
無題 無名 ID:Ce1hTuUI 2021/03/11(四) 17:29:54.857 No.21831179
無題 無名 ID:NP.ByDNw 2021/03/11(四) 17:30:07.024 No.21831181 無題 無名 ID:Ce1hTuUI 2021/03/11(四) 17:34:04.839 No.21831236 >>21831181除非你開啟unsafe不然你看不到摸不到這東西
幹麻用虛無飄渺的東西解釋?
然後指標是位置,你要說背後原理就算了,但兩者不是相同的
無題 無名 ID:5w9avgWM 2021/03/11(四) 17:41:46.768 No.21831306 >>21831181不一樣
有致命性的差異
會這麼講話就證明你有多外行
簡單講一點就好
指標可以像個數字一樣做加減運算
可以跳去修改你想要亂搞的記憶體區塊
參考不能這麼做
無題 無名 ID:NP.ByDNw 2021/03/11(四) 17:42:38.746 No.21831320 >>21831236>幹麻用虛無飄渺的東西解釋?
因為正常人一定寫過linked list
你不用指標解釋難道要用更複雜的概念去說明它的用處嗎
除非C#是微軟裡面的天才從0開始用組語實現編譯器
不然一定可以用最基本的C去解釋
如果你怕別人會C#但不會C的話
那我覺得跟他解釋reference還不如直接唬爛他說跟賦值一樣
無題 無名 ID:Ce1hTuUI 2021/03/11(四) 17:47:31.748 No.21831382 無題 無名 ID:NP.ByDNw 2021/03/11(四) 17:49:13.219 No.21831401 >>21831306說穿了不就比較不自由的指標
貼個新標籤就當新技術了喔
你還真好騙欸
那smart pointer會不會也被你當成新技術啊
無題 無名 ID:Ce1hTuUI 2021/03/11(四) 17:53:48.064 No.21831449
>>21831401該停了,習慣來說,只要稱呼的方式不同最好兜當兩個東西看比較好
可能有實作方式的不同,或是技術依賴不同,有時更可能背後基礎概念的不同,當新東西重新檢查一次或比較妥善。
除非文件有明說只是單純換名稱,但基本上不會有這種事
無題 無名 ID:mLp2z2/2 2021/03/11(四) 17:55:48.166 No.21831471 >>21831306int *是指標
int const *不是指標,有致命性的差異、混在一起講就證明你有多外行
無題 無名 ID:5w9avgWM 2021/03/11(四) 18:05:34.988 No.21831593
無題 無名 ID:NP.ByDNw 2021/03/11(四) 18:29:50.975 No.21831833 >>21831382也沒欺負啊
不懂的東西就是用最簡單的東西去解釋就好
大一一定學過C也學過指標
直接跟他講就是指標讓他明白就好 想白目去把C/C++那套概念拿來亂搞編譯器也會教訓他
不然寫JAVA跟C#的人那麼多你去問他們想像中的GC是怎麼運作
絕對不脫離程式幫你自動delete/free
如果有人回答GC是把記憶體標記回收->壓縮資料->把活很久的資料複製到另一區
那他大概是負責開發JVM的
無題 無名 ID:Ce1hTuUI 2021/03/11(四) 19:00:06.235 No.21832098 無題 無名 ID:Ce1hTuUI 2021/03/11(四) 19:02:52.660 No.21832128
無題 無名 ID:9jDd1Tsg 2021/03/11(四) 22:10:23.891 No.21834444
無題 無名 ID:9jDd1Tsg 2021/03/11(四) 22:16:02.454 No.21834508