C#探秘系列(四)——GetHashCode,ExpandoObject
这篇继续分享下gethashcode和expandoobject这两个比较好玩的方法。
一:gethashcode
从msdn上可以看到的解释是:用作特定类型的哈希函数,也就是说任何对象的实例都会有一个int32类型的hashcode,并且存放在fcl中的hashcollection中,废话不说,看个例子:
从图中可以看到,两个类实例的hashcode不同,说明二者不是同一个引用,也就有了不同的hashcode,利用这个特性,我们是不是可以生成一些随机数字呢?
1:在for循环中用random生成。
static void main(string[] args)
{
var list = new list<int>();
for (int i = 0; i < byte.maxvalue; i++)
{
list.add(new random().next(0, byte.maxvalue));
}
list.foreach((i) =>
{
console.writeline(i);
});
console.read();
}
我们知道random都是伪随机的,所以会出现一连串的数字重复,那么我真的想要随机数怎么办呢?这时候就可以用hashcode试试了
2:for循环中的hashcode
static void main(string[] args)
{
var list = new list<int>();
for (int i = 0; i < byte.maxvalue; i++)
{
list.add(new random().gethashcode());
}
list.foreach((i) =>
{
console.writeline(i);
});
console.read();
}
不过我们看到,我们不断的向托管推上仍垃圾,所以对gc还是有一定的性能开销的。
二:expandoobject
我们知道php,asp,js都是解释性的语言,免去了编译的烦恼,我去年做过半年的php,然后回归c#,然后就会对c#的编译特别的不爽,有时候一个solution一百多个dll,编译都要10多分钟,每周的发布日都会通过自动化工具发布到生产环境,然而在到生产环境下前的各个环境中,都需要重新编译,导致很多时间都耗费在编译上面去了,不过在c#4.0之后,我们通过动态的特性,也能够做到把c#当作js来写。比如这里的expandoobject类,我们可以通过后期绑定来向expandoobject动态的追加一些属性和方法,非常有意思。不过这里要注意的是一但开了dynamic,编译器也就不认这些代码了,也就实现了免编译的功能。
static void main(string[] args)
{
dynamic obj = new system.dynamic.expandoobject();
obj.name = "hxc";
obj.age = 20;
obj.call = new action(() => { console.writeline("call me!!!"); });
obj.call();
console.read();
}
推荐阅读
-
C#探秘系列(三)——StackTrace,Trim
-
C#探秘系列(四)——GetHashCode,ExpandoObject
-
C#探秘系列(四)——GetHashCode,ExpandoObject
-
C#多线程编程系列(四)- 使用线程池
-
C#探秘系列(三)——StackTrace,Trim
-
C#探秘系列(一)——ToDictionary,ToLookup
-
C#探秘系列(二)——IsXXX 系列方法
-
C#探秘系列(四)——GetHashCode,ExpandoObject
-
C#网络编程系列文章(四)之TcpListener实现同步TCP服务器
-
C#网络编程系列文章(四)之TcpListener实现同步TCP服务器