zoukankan      html  css  js  c++  java
  • 在线列表类二 dodo

     public class CacheOnline<TKey, TValue>
             where TKey : IComparable<TKey>
             where TValue : OnlineUser<TKey>, new()
    ...{...}
    跟想象中的类实在太不一样, 我也是才接触一天,有些错误也是难免的,
    CacheOnline<TKey, TValue>
    其中 TKey, TValue 就是泛型类型关键字,通常规定用大写字母T开头,包含在尖括号<>中,它实际上并不是一个类型,而更像是一个类型的蓝图。若要使用 GenericList<T>,客户端代码必须通过指定尖括号中的类型参数来声明和实例化构造类型。此特定类的类型参数可以是编译器识别的任何类型。(http://www.gzctu.com/blog/blogview.asp?id=250)

    再来看看
             where TKey : IComparable<TKey>
             where TValue : OnlineUser<TKey>, new()
    where关键字实现的是对类型参数的约束,(http://www.gzctu.com/blog/blogview.asp?id=251)这里则:TKey必须为IComparable接口,TValue必须为类OnlineUser(OnlineUser 类主要描述用户信息)而new()则 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。当泛型类创建类型的新实例时,将此约束应用于类型参数.当与其他约束一起使用时,new() 约束必须最后指定:

    关于更多的就不再说了,实在说不清楚,也不是下子能明白的,多看看MSDN吧.
    泛型可用于变量的声明如
    Dictionary<string, LinkedListNode<TValue>> _MemberUserList;
    Dictionary 为泛型集合(http://www.gzctu.com/blog/blogview.asp?id=265)总之这里就是要把在线用户的信息方入这个集合里面去,
    然而,在声明变量地方看到三个关键字 LinkedListNode,LinkedList和ReaderWriterLock 其解释分别如下

    LinkedList<(Of <(T>)>) 为通用链表(http://msdn2.microsoft.com/zh-cn/library/he2s3bh7.aspx)

    LinkedList<(Of <(T>)>) 集合的每个元素都是 LinkedListNode<(Of <(T>)>)。LinkedListNode<(Of <(T>)>) 包含一个值、对其所属的 LinkedList<(Of <(T>)>) 的引用、对下一个节点的引用,以及对上一个节点的引用。(http://msdn2.microsoft.com/zh-cn/library/ahf4c754.aspx)

    ReaderWriterLock 用于同步对资源的访问。在任一特定时刻,它允许多个线程同时进行读访问,或者允许单个线程进行写访问。在资源不经常发生更改的情况下,ReaderWriterLock 所提供的吞吐量比简单的一次只允许一个线程的锁更高。

    在多数访问为读访问,而写访问频率较低、持续时间也比较短的情况下,ReaderWriterLock 的性能最好。多个读线程与单个写线程交替进行操作,所以读线程和写线程都不会长时间阻止。(http://msdn2.microsoft.com/zh-cn/library/system.threading.readerwriterlock(VS.80).aspx)

    至此这个 在线用户类 的整体轮廓也出来了,其主要就是对 泛型集合 Dictionary 的各种操作
    构造一个定时器,默认为每30分钟更新一下在线用户(清除不在线的 其具体的我也还说不出来 始终学得太少了 哈哈)

    说了很多废话,来简单看下怎么调用,其实 FrameWorkLogin.cs 中已经有很多例子了,
    比如 检测在线列表(checkOnline)中获取 用户信息
    OnlineUser<int> ou =   FrameWorkPermission.UserOnlineList.GetValue(U_LoginName);
    OnlineUser<int> ou 与 用户基础类 public class OnlineUser<TKey>相呼应,此处 <int>ou 则表名ou为整型,如果是常规的 int ou 则会有个装箱过程,根据 FrameWorkPermission.UserOnlineList 跳到 文件 FrameWorkPermission.cs 看到
    public static CacheOnline<int, OnlineUser<int>> UserOnlineList = null;
    CacheOnline<int, OnlineUser<int>> 则与public class CacheOnline<TKey, TValue>向呼应 这里取出的值都为整型(根据用户名获取用户信息),
  • 相关阅读:
    mysql_example
    windows 下 解决 go get 或 dep init 更新不了问题
    golang反射
    Windows下修改hosts并且让他立即生效
    Windows不重启就使环境变量修改生效
    swoole进程-2
    swoole进程
    swoole协程
    区间素数筛法
    AOJ
  • 原文地址:https://www.cnblogs.com/zgqys1980/p/1804798.html
Copyright © 2011-2022 走看看