zoukankan      html  css  js  c++  java
  • 正确理解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:

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

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

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

  • 相关阅读:
    数据库 数据库编程二
    Linux 退格键不回显
    数据库 数据库编程一
    数据库 SQL语法二
    数据库 SQL语法一
    数据库 Linux下的MySQL数据库管理
    docker-compose
    winodws同步时间命令
    国内yum源的安装(163,阿里云,epel)
    postgresql双机热备、高可用方案(采用pacemaker+corosync实现)
  • 原文地址:https://www.cnblogs.com/egmkang/p/7449603.html
Copyright © 2011-2022 走看看