關鍵字:SQL性能 方法
在上一篇文章中,我們通過一些示例談論了IL與CLR中的一些特性。IL與C#等高級語言的作用類似,主要用于表示程序的邏輯。由于它同樣了解太多CLR中的高級特性,因此它在大部分情況下依舊無法展現出比那些高級語言更多的CLR細節。因此,如果您想要通過學習IL來了解CLR,那么這個過程很可能會“事倍功半”。因此,從這個角度來說,老趙并不傾向于學習IL。不過嚴格說來,即使IL無法看出CLR的細節,也不足以說明“IL無用”——這里說“無用”自然有些夸張。但是,如果我們還發現,那些原本被認為需要通過IL挖掘到的東西,現在都可以使用更好的方法來獲得,并且可以起到“事半功倍”的效果,那么似乎我們真的沒有太多理由去追逐IL了。
在這篇文章中,我們使用最多的工具便是.NET Reflector,從.NET 1.x開始,.NET Reflector就是一個探究.NET框架(主要是BCL)內部實現的有力工具,它可以把一個程序集高度還原成C#等高級語言的代碼。在它的幫助下,幾乎所有程序集實現都變得一目了然,這大大方便了我們的工作。老趙對此深有感觸,因為在某段不算短的時間內,我使用.NET Reflector閱讀過的代碼數量遠遠超過了自己編寫的代碼。與此相反的是,老趙幾乎沒有使用IL探索過.NET框架下的任何問題。這可能還涉及到方式方法和個人做事方式,但是如果這真有效果的話,為什么要舍近求遠呢?希望您看過了這篇文章,也可以像我一樣擺脫IL,投入.NET Reflector的懷抱。
示例一:探究語言細節
C#語言從1.0到3.0版本的進化過程中,大部分新特性都是依靠編譯器的魔法。就拿C#3.0的各種新特性來說,Lambda表達式,LINQ,自動屬性等等,完全都是基于CLR 2.0中已有的功能,再配合新的C#編譯器而產生的各種神奇效果。有些朋友認為,掌握IL之后便把握了.NET的根本,以不變應萬變,只要讀懂IL,那么這些新特性都不會對您形成困擾。這話說的并沒有錯,只是老趙認為,“掌握IL”在這里只是一個“充分條件”而不是一個“必要條件”,我們完全可以使用.NET Reflector將程序集反編譯成C#代碼來觀察這些。
這里我們使用.NET Reflector來觀察最最常見,最最普通的foreach關鍵字的功能。我們都知道foreach是遍歷一個IEnumerble對象內元素的方式,我們也都知道foreach其實是GoF Iterator模式的實現,通過MoveNext方法和Current屬性進行配合共同完成。不過大部分朋友似乎都是從IL進行觀察,或是“聽別人說”而了解這些的。事實上,.NET Reflector也可以很容易地證實這一點,只是這中間還有些“特別”的地方。那么首先,我們還是來準備一個最簡單的foreach語句:
static void DoEnumerable(IEnumerable source)
{
foreach (int i in source)
{
Console.WriteLine(i);
}
}
如果觀察它的IL代碼,即使不了解IL的朋友也一定可以看出,其中涉及到了GetEnumerator,MoveNext和Current等成員的訪問:
.method private hidebysig static void DoEnumerable(
class [mscorlib]System.Collections.Generic.IEnumerable`1 source) cil managed
{
.maxstack 1
.locals init (
[0] int32 i,
[1] class [mscorlib]System.Collections.Generic.IEnumerator`1 CS$5$0000)
L_0000: ldarg.0
文章來源于領測軟件測試網 http://www.kjueaiud.com/