zoukankan      html  css  js  c++  java
  • 挖一挖C#中那些我们不经常使用的东西之系列(4)——GetHashCode,ExpandoObject

    一:GetHashCode

      从MSDN上能够看到的解释是:用作特定类型的哈希函数,也就是说不论什么对象的实例都会有一个int32类型的HashCode。而且存放在FCL中的

    HashCollection中,废话不说,看个样例:

    从图中能够看到,两个类实例的hashcode不同。说明二者不是同一个引用,也就有了不同的hashcode。利用这个特性,我们是不是

    能够生成一些随机数字呢?

    1:在for循环中用random生成。

    复制代码
     1         static void Main(string[] args)
     2         {
     3             var list = new List<int>();
     4 
     5             for (int i = 0; i < byte.MaxValue; i++)
     6             {
     7                 list.Add(new Random().Next(0, byte.MaxValue));
     8             }
     9 
    10             list.ForEach((i) =>
    11             {
    12                 Console.WriteLine(i);
    13             });
    14 
    15             Console.Read();
    16         }
    复制代码

    我们知道Random都是伪随机的,所以会出现一连串的数字反复。那么我真的想要随机数怎么办呢?这时候就能够用HashCode试试了

    2:for循环中的hashcode

    复制代码
     1         static void Main(string[] args)
     2         {
     3             var list = new List<int>();
     4 
     5             for (int i = 0; i < byte.MaxValue; i++)
     6             {
     7                 list.Add(new Random().GetHashCode());
     8             }
     9 
    10             list.ForEach((i) =>
    11             {
    12                 Console.WriteLine(i);
    13             });
    14 
    15             Console.Read();
    16         }
    复制代码

    只是我们看到,我们不断的向托管推上仍垃圾,所以对GC还是有一定的性能开销的。

     

    二:ExpandoObject

         我们知道php,asp。js都是解释性的语言,免去了编译的烦恼,我去年做过半年的php,然后回归C#,然后就会对C#的编译特别的不爽

    ,有时候一个solution一百多个dll,编译都要10多分钟,每周的公布日都会通过自己主动化工具公布到生产环境,然而在到生产环境下前的各个环

    境中,都须要又一次编译,导致非常多时间都耗费在编译上面去了,只是在C#4.0之后。我们通过动态的特性,也可以做到把C#当作js来写。

    比方这里的ExpandoObject类,我们能够通过后期绑定来向ExpandoObject动态的追加一些属性和方法,很有意思。只是这里要注意的是

    一但开了dynamic,编译器也就不认这些代码了。等着CLR里面的JIT去跑它了,从而达到免编译功能。

    复制代码
     1         static void Main(string[] args)
     2         {
     3             dynamic obj = new System.Dynamic.ExpandoObject();
     4             
     5             obj.Name = "hxc";
     6 
     7             obj.Age = 20;
     8 
     9             obj.Call = new Action(() => { Console.WriteLine("call me!!!"); });
    10 
    11             obj.Call();
    12 
    13             Console.Read();
    14         }
    复制代码

  • 相关阅读:
    数据库表结构查询SQL
    Java实现数据库备份并利用ant导入SQL脚本
    生死看淡,不服就干。SQL常见的一些优化。
    mybatis + PageHelper 实现分页
    自定义数据库连接池实现方式 MySQL
    Docker 镜像基础(三)
    Docker 镜像管理及基础命令(二)
    Docker 介绍和安装(一)
    Docker 镜像管理及基础命令(二)
    Tomcat-8 安装和配置
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7244074.html
Copyright © 2011-2022 走看看