挖一挖C#中那些我們不常用的東西之系列(4)——GetHashCode,ExpandoObject

一線碼農發表於2014-05-14

 

  這篇繼續分享下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         }

 

相關文章