這是一個古老的問題,其他語言裏面幾乎沒有,C#、C++中有類似的概念,但思想是不同。
Pascal中的Record是複製型賦值,Class是引用複製。這個基礎邏輯很關鍵。涉及到延伸的功能實現產生的錯誤。
delphi中有一個聲明在Diagnostics的秒錶功能,是以Record記錄的方式實現的,即 TStopwatch=Record….,我希望通過這已有的功能擴展生成通用的超時功能。爲此想用字典的方式增加了一個TTimeOut的(記錄、類),從原理上兩者都可以,實現相關邏輯。
- 每次需要增加一個判斷標記,並開始一個記時,
- TTimeOut的(記錄、類)內會有一個任務(線程、工作、任務),掃描存在的標記,
- 超過時間即報警,並清除標記和記錄。
但實際上就發生了問題,TTimeOut 第一次聲明的詞典是 TDictionary<string, _TStopwatch>,但是_TStopwatch定義的是記錄。在使用過程中字典中中的值始終沒有變化。監視字典“表計”是否實現Start動作,均有。但到了內部isRunning卻都是False。然後計劃將_TStopwatch通過指針方式聲明,操作過程中發現,爲什麼要這麼麻煩。直接將_TStopwatch聲明爲類不就是一樣的效果。帶來的附帶問題,就是資源釋放。Delphi提供了 TObjectDictionary<string, _TStopwatch>,這樣就很方便了,釋放的問題也就沒有了。
代碼小做改動、測試OK。
總結:
記錄是複製傳值,所以TDictionary<string, _TStopwatch>的Item並不是原實例,而TObjectDictionary<string, _TStopwatch>的Item是參照,指向的就是原實例。
備註:
- 爲什麼原生語言中定義了類還要定義指針,效率是一方面,合理纔是更重要的原因。
- 如前文準備用指針方式。
- Class本身就是指針。