正確理解Handle對象

上古時期的程序員, 確定都知道Handle對象, 通常中文翻譯成句柄. 通常的Handle在實現上, 都是一個整數, 而這個整數能夠理解爲一個指針, 指針指向的地址呢, 又保存了另一個指針. 之因此這麼搞, 是由於這樣搞可讓真實的對象能夠挪動.程序員

考慮一個一個對象A, 保存在Handle裏面, 因爲某種緣由, 我須要把這個對象A從原來的位置移走, 那麼移走以後的對象叫對象B, 那我只須要修改一下Handle裏面的指針, 就能夠保證正確性, 而後在用戶看來, 仍是同一個對象, 由於Handle沒有改變.編程

正是由於Handle這種特性, 因此能夠基於Handle作一個GC系統. miloyip翻譯的那本遊戲編程的書裏面也講過, 以前在主機上有人用Handle來管理內存.服務器

而我這篇文章想說的是, Handle這種特性其實還能夠用在跟UI有關係的系統裏面. 試想一個遊戲客戶端和服務器要頻繁打交道, 而後C#這種引用語意的語言中, 不少程序員都會在UI層保存一個Entity對象, 因爲一些緣由, 會致使整個系統內部會出現兩個Entity對象, 其ID同樣.編碼

你能夠說這是因爲程序員的編碼不正確, 我也確信這一點. 可是咱們要從根本層面上解決這個問題, 而不是把這個問題推卸給人.翻譯

因爲咱們知道Handle可讓咱們把對象挪動, 那麼咱們也只須要在C#造這樣一個東西就好了. 這樣在使用的時候, 只讓程序員用Handle<T>來操做T這個類型的Entity對象. 那麼系統內部, 就只會有一個Entity.指針

PS:code

通常好比文件描述符/文件都是一個Handle, 跟OS打交道的硬件資源, 通常都是Handle.對象

Linux下, 一個thread_t也是句柄~~遊戲

再好比, Sun之前實現的JVM, 一個reference也是一個Handle.ip

相關文章
相關標籤/搜索