egmkang 服务端开发工程师

正确理解Handle对象

2016-08-18
C#

上古时期的程序员, 肯定都知道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:

一般比如文件描述符/文件都是一个Handle, 跟OS打交道的硬件资源, 一般都是Handle.

Linux下, 一个thread_t也是句柄~~

再比如, Sun以前实现的JVM, 一个reference也是一个Handle.


上一篇 String.IndexOf

Comments