Pascal 中記錄和類---Record 和 Class

這是一個古老的問題,其他語言裏面幾乎沒有,C#、C++中有類似的概念,但思想是不同。

Pascal中的Record是複製型賦值,Class是引用複製。這個基礎邏輯很關鍵。涉及到延伸的功能實現產生的錯誤。

delphi中有一個聲明在Diagnostics的秒錶功能,是以Record記錄的方式實現的,即 TStopwatch=Record….,我希望通過這已有的功能擴展生成通用的超時功能。爲此想用字典的方式增加了一個TTimeOut的(記錄、類),從原理上兩者都可以,實現相關邏輯。

  1. 每次需要增加一個判斷標記,並開始一個記時,
  2. TTimeOut的(記錄、類)內會有一個任務(線程、工作、任務),掃描存在的標記,
  3. 超過時間即報警,並清除標記和記錄。

但實際上就發生了問題,TTimeOut 第一次聲明的詞典是 TDictionary<string, _TStopwatch>,但是_TStopwatch定義的是記錄。在使用過程中字典中中的值始終沒有變化。監視字典“表計”是否實現Start動作,均有。但到了內部isRunning卻都是False。然後計劃將_TStopwatch通過指針方式聲明,操作過程中發現,爲什麼要這麼麻煩。直接將_TStopwatch聲明爲類不就是一樣的效果。帶來的附帶問題,就是資源釋放。Delphi提供了 TObjectDictionary<string, _TStopwatch>,這樣就很方便了,釋放的問題也就沒有了。

代碼小做改動、測試OK。

總結:

記錄是複製傳值,所以TDictionary<string, _TStopwatch>的Item並不是原實例,而TObjectDictionary<string, _TStopwatch>的Item是參照,指向的就是原實例。

備註:

  • 爲什麼原生語言中定義了類還要定義指針,效率是一方面,合理纔是更重要的原因。
  • 如前文準備用指針方式。
  • Class本身就是指針。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章