九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
C#學(xué)習(xí)筆記(一)——軟件構(gòu)建與.NET平臺(tái)

目錄

一 軟件構(gòu)建,智者的積木

二 語言沒有“銀彈”正如世間難尋“圣杯”

三 .NET平臺(tái)結(jié)構(gòu)

一 軟件構(gòu)建,智者的積木

  多年來,眾多的業(yè)界巨子給軟件構(gòu)建做出了不同的比喻,雖然你可能并不認(rèn)識(shí)他們,也不打算了解這些巨人的英雄史詩,但是你應(yīng)該了解他們對(duì)軟件構(gòu)建的看法,畢竟他們才是這場(chǎng)游戲中的高級(jí)玩家。我并不想討論這些隱喻是否合理,我只希望以下隱喻能夠幫助你重新思考下軟件構(gòu)建活動(dòng)。

  寫作 這一隱喻暗示著軟件開發(fā)過程是一種以編寫代碼為主的代價(jià)昂貴的試錯(cuò)過程,而非仔細(xì)的規(guī)劃和設(shè)計(jì)。

  耕種 這一隱喻暗示了軟件就想是耕種一樣,你每次只處理它的一小部分,一點(diǎn)一點(diǎn)的加到整個(gè)系統(tǒng),使系統(tǒng)一點(diǎn)一點(diǎn)的“生長(zhǎng)”。它也暗示了,工作應(yīng)該按部就班,正如春種秋收一樣,各個(gè)環(huán)節(jié)有強(qiáng)硬的邏輯存在。

  蓋房子 這一隱喻形象的說明了規(guī)劃和設(shè)計(jì)在構(gòu)建活動(dòng)中的重要性,同時(shí)也暗示了軟件在初期修復(fù)缺陷的成本要遠(yuǎn)遠(yuǎn)低于在后期的修復(fù)成本。

  焦油坑 經(jīng)典書籍《人月神話》的第一章提到的:“大型系統(tǒng)的開發(fā)就猶如這樣一個(gè)焦油坑,很多大型和強(qiáng)壯的動(dòng)物在其中劇烈的掙扎,他們中大多數(shù)開發(fā)出了可運(yùn)行的系統(tǒng)——不過只有極少數(shù)的項(xiàng)目滿足了目標(biāo)、進(jìn)度和預(yù)算的要求。”

  不管你是否同意以上觀點(diǎn),它們確實(shí)在一定時(shí)期影響了一部分人。而我想從一名程序員的角度來說我對(duì)軟件構(gòu)建的認(rèn)識(shí)。我覺得軟件構(gòu)建過程對(duì)于程序員來說,就像是在玩樂高積木。眾多的語言給我們提供了形形色色的API,就如同不同形狀、顏色的積木塊。業(yè)界標(biāo)準(zhǔn)構(gòu)成了積木之間的接點(diǎn),使積木塊之間無縫銜接。單個(gè)的小積木通過接點(diǎn)組合成你想要的任何形狀和功能的大的模塊,模塊和模塊之間再相互組合,形成更大的系統(tǒng)。軟件構(gòu)建與玩積木兩者都是考驗(yàn)?zāi)X力的智力活動(dòng),你可以按照?qǐng)D紙玩積木(別人設(shè)計(jì)的),也可以用積木來拼裝你想要的任何東西(自己做設(shè)計(jì))。(ps.我小時(shí)候用樂高的“潛水艇”積木拼出了星際I中的“歌利亞”。)也就是說,語言、平臺(tái)就在那里,你能做出什么,就看你能想到什么,以及你的團(tuán)隊(duì)能實(shí)現(xiàn)什么。

  軟件構(gòu)建是一項(xiàng)十分復(fù)雜的工作,絕不是一個(gè)人的工作,而是一件團(tuán)隊(duì)活動(dòng)。下面,給出軟件構(gòu)建的最普遍活動(dòng):

  • 定義問題
  • 需求分析
  • 規(guī)劃構(gòu)建
  • 軟件架構(gòu)
  • 詳細(xì)設(shè)計(jì)
  • 編碼與調(diào)試
  • 單元測(cè)試
  • 集成測(cè)試
  • 集成
  • 系統(tǒng)測(cè)試
  • 保障維護(hù)

  以上活動(dòng)在整個(gè)軟件構(gòu)建過程中會(huì)反復(fù)、交替進(jìn)行,這些活動(dòng)僅僅是基于技術(shù)的產(chǎn)品導(dǎo)向過程,而沒有包括相應(yīng)的管理活動(dòng)。對(duì)于程序員來說,編碼與調(diào)試往往占據(jù)了我們的大部分時(shí)間。而其他活動(dòng)隨項(xiàng)目的類型和規(guī)模,往往有所“裁剪”。可見,軟件構(gòu)建過程十分復(fù)雜,正因?yàn)槠鋸?fù)雜性,人們?yōu)榱舜_保軟件項(xiàng)目的成功,試圖尋找一套結(jié)構(gòu)化方法。但是到目前為止,也沒有找到能夠保證軟件項(xiàng)目100%成功的方法。雖然軟件項(xiàng)目中,“圣杯”并不存在,但是我們?nèi)匀坏玫搅讼喈?dāng)有用的方法或指南,以提高項(xiàng)目成功幾率,并使這種成功得以再現(xiàn),例如軟件工程理論,PMI制定的項(xiàng)目管理指南(PMBOK)以及敏捷開發(fā)的相關(guān)思想等等。

二 語言沒有“銀彈”正如世間難尋“圣杯”

  如果把開發(fā)語言當(dāng)成一門外語的話,那么我們程序員無疑掌握了眾多的“外語”,即使外語翻譯也望塵莫及。正如外語一樣,不同語言有不同的特點(diǎn),要造就了不同的陣營(yíng)與擁護(hù)者。在不同陣營(yíng),并相互抨擊的時(shí)候,你是否還猶豫不決,是否又有轉(zhuǎn)移方向的沖動(dòng)?某位業(yè)界大牛說過,好的程序員要掌握3類語言:一、快速開發(fā)的語言;二、吃飯的語言;三、最鐘愛的語言。這只是3類語言,并不是說3種。你完全可以學(xué)習(xí)一門語言并說它在這3個(gè)方面都很出色。(ps.目前我看PHP有這個(gè)苗頭。)還有一種說法就是“學(xué)得多,學(xué)的淺“。不管你是想深入掌握一門語言還是要廣泛了解多門語言,你一定要認(rèn)識(shí)到開發(fā)語言沒有所謂的“銀彈”,或許某些語言能獨(dú)擋一面,當(dāng)沒有哪種語言是全才,其必有優(yōu)勢(shì)與劣勢(shì),而且隨著時(shí)間的推移,今日風(fēng)光的語言,明日可能就會(huì)被淘汰。如果你鐘愛一門語言就不要被路人輕易打動(dòng)而另投他人門派。學(xué)習(xí)語言是一件持之以恒的事情,當(dāng)你想改換門派的時(shí)候不妨問問,這門語言真的好嗎,你真的深入理解了你現(xiàn)在的語言了嗎,它真的是你想要的嗎?編程之真諦在于思想,透過語言編程才是正確的道路。

  每個(gè)人的經(jīng)歷不同可能會(huì)有不同的語言基礎(chǔ),我在眾多語言之中選擇了C#,我并不認(rèn)為C#對(duì)所有人都適合,但它的諸多優(yōu)點(diǎn)讓我難以放棄。以下是我選擇C#的理由。

  .Net平臺(tái)非常強(qiáng)大 .NET平臺(tái)提供了豐富的類庫,涵蓋了幾乎所有領(lǐng)域的應(yīng)用,不需要借助其它語言,就能開出幾乎所有的應(yīng)用。當(dāng)然,大量的API也需要我們不斷的學(xué)習(xí)。

  強(qiáng)大的開發(fā)環(huán)境 Visual Studio 可謂是IDE中的王者,用了之后就會(huì)被其強(qiáng)大的功能所吸引,在結(jié)合微軟的TFS,在軟件項(xiàng)目管理中將發(fā)揮出極大的作用。

  豐富的資源 微軟的MSDN,微軟社區(qū)還有大量的參考書籍,及龐大的用戶群,造就了一個(gè)龐大的資源寶庫,你身處于這樣龐大的群體之中,能夠更快更容易的掘取知識(shí)。

  入門簡(jiǎn)單 C#本身就是一門面向?qū)ο蟮母呒?jí)語言。相比于低級(jí)語言,其語法和代碼可讀性更高,更容易讓人接受,你完全可以通過書籍自學(xué)成才。

  開發(fā)周期快 C#或者說.NET的類庫已經(jīng)為我們做了大量的工作,相比其它語言,你的代碼量更少,你開發(fā)系統(tǒng)的周期更短,無論是大型項(xiàng)目還是小型項(xiàng)目你都會(huì)得益于這種快速的開發(fā)。當(dāng)然,開發(fā)周期短也得益于Visual Studio 的強(qiáng)大功能。 

  與各種微軟產(chǎn)品的無縫集成 你可以和微軟的其它產(chǎn)品例如SQL Server,Office,Sharepoint,OC等無縫集成。

  當(dāng)然,C#也有一些劣勢(shì):

  不跨平臺(tái) C#只能用于開發(fā).NET程序,雖然.NET被設(shè)計(jì)為平臺(tái)無關(guān),但目前還無法在Linux等平臺(tái)上穩(wěn)定運(yùn)行.NET程序,雖然有個(gè)開源的Mono,但其可靠性有待測(cè)試。這會(huì)讓你失去很大的發(fā)揮空間,即使你能構(gòu)建客戶需要的軟件,如果客戶堅(jiān)持使用Linux系統(tǒng)你也只能放棄。或許有那么一天,.NET可以用于其它平臺(tái),但現(xiàn)在我們還是在Windows平臺(tái)玩吧。

  開源資源相對(duì)較少 相比其他語言,用C#寫的開源項(xiàng)目還是少數(shù),有些時(shí)候你只能自己寫框架了。

  綜上所述,語言沒有“銀彈”,如果你享受C#給你帶來的便捷,同時(shí)接受了它的不足,并決定深入學(xué)習(xí)的話,我希望下面的文章能對(duì)你有所幫助。

三 .NET平臺(tái)結(jié)構(gòu)

  從程序員的角度看,.NET可以理解為一個(gè)運(yùn)行庫環(huán)境(mscoree.dll)和一個(gè)全面的基類庫(mscorlib.dll)。如下圖所示:

(一)基類庫

  .Net Framework 中包含了Framework 類庫(Framework Class Library,F(xiàn)CL),有些書籍中也稱為BCL,微軟正以驚人的速度在完善FCL,為我們構(gòu)建大型系統(tǒng)提供便利。如果想全面了解FCL,我推薦的書籍是《C#高級(jí)編程》,目前已經(jīng)出到第七版了。該書以頁數(shù)和全面著稱,但不足之處在于,其內(nèi)容比較基礎(chǔ),要想深入學(xué)習(xí),需結(jié)合其它書籍。FCL十分龐大,而且在不斷完善中,最好有針對(duì)性的學(xué)習(xí)某一分支,避免將精力分散。

(二)公共語言運(yùn)行時(shí)

  運(yùn)行時(shí)(runtime),可以理解為執(zhí)行給定編譯代碼單元所需的外部服務(wù)的集合。如上圖所示,.NET的運(yùn)行時(shí)叫CLR(Common Language Runtime),即公共語言運(yùn)行時(shí),是一個(gè)可由多種開發(fā)語言使用的“運(yùn)行時(shí)”。CLR不關(guān)心使用何種開發(fā)語言,只要相應(yīng)的開發(fā)語言的編譯器面向CLR即可。微軟已經(jīng)創(chuàng)建了幾個(gè)面向CLR的語言,包括:C++/CLI、C#、VB、F#、Python、Ruby,以及自己的編譯器。其它機(jī)構(gòu)也制定了一些面向“CLR”的開發(fā)語言和編譯器。但是,使用最廣泛的還是微軟的C#語言。CLR的核心功能包括:內(nèi)存管理,程序集加載,安全性,異常處理和線程同步等等。通常在CLR的控制下運(yùn)行的代碼稱為托管代碼。源代碼的編譯和執(zhí)行過程如下:

1 源代碼編譯

  編譯的第一步——把源代碼編譯為托管模塊(其中,C++的編譯器比較特殊,它能同時(shí)生成托管和非托管代碼,并生成到同一模塊中。)

  托管模塊 托管模塊是一個(gè)標(biāo)準(zhǔn)32(64)位Windows可移植載體PE32(PE32+)文件,需要CLR才能執(zhí)行。托管模塊的組成如下:

  元數(shù)據(jù) 元數(shù)據(jù)是一組數(shù)據(jù)表。其中一些數(shù)據(jù)表描述了模塊中定義的內(nèi)容,比如類及其成員。還有一些元數(shù)據(jù)描述了托管代碼模塊引用的內(nèi)容,比如引用的類及成員。 這些元數(shù)據(jù)描述了每一個(gè)二進(jìn)制文件中定義的類型(類、結(jié)構(gòu)、枚舉等),以及每個(gè)類型的成員(屬性、方法、事件等)。Visual Studio 等開發(fā)工具通過元數(shù)據(jù)實(shí)現(xiàn)智能感知,而元數(shù)據(jù)也成為包括WCF、Web Service、反射、晚期綁定和對(duì)象序列化等技術(shù)的支柱。

  MSIL Microsoft Intermediate Language (MSIL)微軟中間語言,也被叫做CIL(公共中間語言),或者簡(jiǎn)稱IL。其本質(zhì)上是.NET平臺(tái)的母語。任何一種支持.NET的語言在邏輯上都需要支持IL的,也都會(huì)被編譯為IL。

  IL具有以下特征:

  • 面向?qū)ο蠛?/span>使用接口
  • 值類型和引用類型之間的巨大差異
  • 強(qiáng)數(shù)據(jù)類型
  • 使用異常來處理錯(cuò)誤
  • 使用特性

  IL的好處:

  • 語言集成性——每種支持.NET的語言生成的是幾乎相同的IL
  • 平臺(tái)無關(guān)性

  我們不需要直接使用IL來編寫程序,但是在.NET中,使用System.Reflect.Emit這個(gè)命名空間提供的類型可以在開發(fā)出在運(yùn)行時(shí)能夠在內(nèi)存中產(chǎn)生.NET程序集的程序,即“動(dòng)態(tài)程序集”。由于在構(gòu)造程序集時(shí)需要使用專有的IL指令集,所以如果要使用這部分功能開發(fā)軟件,需要掌握IL。

  編譯的第二步——將托管模塊合并為程序集

  CLR不和模塊一起工作,它只和程序集一起工作。程序集是一個(gè)或多個(gè)模塊/資源文件的邏輯性分組,是重用、安全性及版本控制的最小單元。通過程序集的概念,我們可以把一組文件當(dāng)做一個(gè)文件來對(duì)待。將托管模塊合并成程序集的過程如下:

  程序集包含的足夠的信息,使其具有自描述性。CLR能判斷出為了執(zhí)行程序集中的代碼,程序集的直接依賴對(duì)象是什么,不需要注冊(cè)表或 Active Directory Domain Services(ADDS)中保存額外的信息。所以,相較于非托管組件,程序集更容易部署。

2 通用類型系統(tǒng)與公共語言規(guī)范

  公共類型系統(tǒng)與公共語言規(guī)范是,是.NET實(shí)現(xiàn)語言互操作性的基石。語言互操作性的真正含義是用一種語言編寫的類應(yīng)該能直接與另一種語言編寫的類通信,特別是:

  • 用一種語言編寫的類應(yīng)該能繼承用另一種語言編寫的類。
  • 一個(gè)類應(yīng)該能包含另一個(gè)類的實(shí)例,而不管它們是使用什么語言編寫的。
  • 一個(gè)對(duì)象應(yīng)該能直接調(diào)用其它語言編寫的另一個(gè)對(duì)象的方法。
  • 對(duì)象應(yīng)該能在方法之間的傳遞。
  • 在不同的語言之間調(diào)用方法時(shí),應(yīng)能在調(diào)試器中調(diào)試這些方法調(diào)用,即調(diào)試不同語言編寫的源代碼。

2.1 CTS

  類型(type)指的是集合{類,接口,結(jié)構(gòu),枚舉,委托}里的任意一個(gè)成員。CLR完全是圍繞類型展開的,微軟制定了一個(gè)正式的規(guī)范,即"通用類型系統(tǒng)"(Common Type System,CTS),它描述了類型的定義和行為。CTS規(guī)定,一個(gè)類型可以包含零個(gè)或多個(gè)成員,制定了類型的可視性規(guī)則和類型成員的訪問類型,為類型的繼承、虛方法、對(duì)象生存期定義了相應(yīng)的規(guī)則。我們無論使用哪一種語言,類的行為都是完全一致的,因?yàn)樽罱K是由CTS來定義類的行為。

  CTS定義了5種類型:

  • 類類型
  • 接口類型
  • 結(jié)構(gòu)類型
  • 枚舉類型
  • 委托類型

  上述5種類型包含眾多的類型成員即集合{構(gòu)造器,析構(gòu)器,靜態(tài)構(gòu)造函數(shù),嵌套類型,運(yùn)算符,方法,屬性,索引器,字段,只讀字段,常量,事件}中的元素之一。

  CTS還定義了一個(gè)內(nèi)容豐富的類型層次結(jié)構(gòu),其中包含設(shè)計(jì)合理的位置,在這些位置上,代碼允許定義它自己的類型。CTS的層次結(jié)構(gòu)如下:

  此外,CTS建立了一套定義明確的核心數(shù)據(jù)類型,以字符串類型為例:String(VB.NET)、string(C#)、String^(C++/CLI)最終被解釋成為CTS數(shù)據(jù)類型System.String。

2.2 CLS

  為了能適用多種語言,微軟定義了一個(gè)“公共語言規(guī)范”(Common Language Specification,CLS),它詳細(xì)描述了一個(gè)最小的功能集,任何編譯器生成的類型想要兼容由其他符合CLS、面向CLR的語言所生成的組件,就必須支持這個(gè)最小功能集。由于IL是一種豐富的語言,大多數(shù)編譯器的編寫人員有可能把給定編譯器的功能限制為只支持IL和CLS提供的一部分特性。對(duì)于CLS,首先是各個(gè)編譯器的功能不必強(qiáng)大到支持.NET的所有功能;其次,CLS提供了如下保證:如果限制類只能使用CLS兼容特性,就要保證其它兼容語言編寫的代碼可以使用這個(gè)類。編寫非CLS兼容代碼是完全可以接受的,只是在編寫了這種代碼后,就不能保證編譯好的IL代碼完全支持語言的互操作性。也就是說,在開發(fā)類型和方法的時(shí)候,如果希望它們對(duì)外“可見”,能夠從符合CLS的任何一種編程語言中訪問,就必須遵守由CLS定義的規(guī)則。用一種語言定義一個(gè)類型時(shí),如果希望在另一個(gè)語言中使用該類型,就不要在該類型的 public 和 protected 成員中使用位于CLS外部的任何功能。否則,其它其它語言可能無法正常訪問這個(gè)類型的成員。以下代碼定義了一個(gè)不符合CLS的類型:

using System;
//檢查CLS相容性
[assembly:CLSCompliant(true)]

namespace CLRTest
{
//因?yàn)槭莗ublic類,所以驗(yàn)證相容性
public sealed class Test
{
//返回類型不符合CLS
public UInt32 get()
{
return 0;
}

//僅大小寫不同標(biāo)識(shí)符,不符合CLS
public string Get()
{
return "0";
}

//私有方法可以不符合CLS,不會(huì)顯示警告
private UInt32 GET()
{
return 0;
}
}
}

  [assembly:CLSCompliant(true)]特性應(yīng)用于程序集,這個(gè)特性告訴編譯器檢查 public 類型是否符合CLS規(guī)范。這種方法的優(yōu)點(diǎn)是使用CLS兼容性的限制只適用于公共和受保護(hù)的類的成員和公共類。在類的私有實(shí)現(xiàn)方式中,可以編寫非CLS代碼,因?yàn)槠渌绦蚣械拇a不能訪問這部分代碼。

  CLS的基本規(guī)則是“一個(gè)類型的每個(gè)成員要么是一個(gè)字段(數(shù)據(jù)),要么是一個(gè)方法(行為)?!本幾g器遇到枚舉、數(shù)組、屬性、索引器、委托、事件、構(gòu)造器、析構(gòu)器、操作符重載、轉(zhuǎn)換操作符等任何一種構(gòu)造,必須將其轉(zhuǎn)換成字段和方法,使CLR和其它語言能夠訪問這些構(gòu)造。(注:CLR的完整規(guī)則列表,請(qǐng)參考http://msdn.microsoft.com/zh-cn/library/a2c7tshk.aspx。)

3 加載CLR

  生成的程序集既可以是一個(gè)可執(zhí)行應(yīng)用程序,也可以是一個(gè)DLL。運(yùn)行一個(gè)可執(zhí)行文件時(shí),Windows會(huì)檢查這個(gè)EXE文件的頭,判斷應(yīng)用程序是32位的還是64位的(64位Windows提供了WoW64技術(shù),運(yùn)行運(yùn)行32位程序,但有性能損耗)。Windows還會(huì)檢查頭文件中嵌入的CPU架構(gòu)信息,確保當(dāng)前計(jì)算機(jī)符合要求。Windows檢查后完EXE文件的頭,決定創(chuàng)建32位、64位還是WoW64進(jìn)程之后,會(huì)再進(jìn)程的地址空間中加載mscoree.dll(CLR中最重要的部分,稱為“公共對(duì)象運(yùn)行庫執(zhí)行引擎”,它包含大量核心類型,它們封裝了各種常見的編程任務(wù)與核心數(shù)據(jù)類型)的x86、x64或IA64版本。然后進(jìn)程的主線程調(diào)用mscoree.dll中定義的一個(gè)方法。這個(gè)方法初始化CLR,加載EXE程序集,然后調(diào)用其入口方法(Main)。隨即,托管的應(yīng)用程序?qū)?dòng)并運(yùn)行。

4 執(zhí)行程序集的代碼

4.1 程序集執(zhí)行過程

  如前所述,程序集包含元數(shù)據(jù)與IL。為了執(zhí)行一個(gè)方法,首先必須把IL轉(zhuǎn)換成本地CPU指令。這是CLR的JIT(just-in-time,即時(shí))編譯器(也叫“JITter”)的職責(zé)。下圖展示了,方法在被調(diào)用時(shí),發(fā)生的事情:

  在Main方法執(zhí)行之前,CLR會(huì)檢測(cè)出Main的代碼引用的所有類型。這導(dǎo)致CLR分配一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu),它用于管理對(duì)所有引用的類型的訪問。上圖中,Main方法引用了一個(gè)Console類,這導(dǎo)致CLR分配一個(gè)內(nèi)部結(jié)構(gòu)。在這個(gè)內(nèi)部結(jié)構(gòu)中,Console類定義的每個(gè)方法都有一個(gè)對(duì)應(yīng)的記錄項(xiàng)(entry)。每個(gè)記錄項(xiàng)都容納了一個(gè)地址,根據(jù)此地址即可找到方法是實(shí)現(xiàn)。對(duì)這個(gè)結(jié)構(gòu)初始化時(shí),CLR將每個(gè)記錄項(xiàng)都設(shè)置成(指向)包含在CLR內(nèi)部的一個(gè)未文檔化的函數(shù),即上圖中的JITCompiler(《CLR Via C#》中使用的名稱)。Main方法首次調(diào)用WriteLine時(shí),JITCompiler函數(shù)會(huì)被調(diào)用。JITCompiler函數(shù)負(fù)責(zé)將一個(gè)方法的IL代碼編譯成本地CPU命令,根據(jù)運(yùn)行環(huán)境不同,JIT編譯器會(huì)生成相應(yīng)的x86、x64或IA64指令。然后,JITCompiler函數(shù)會(huì)在定義(該類型的)程序集的元數(shù)據(jù)中查找被調(diào)用的方法的IL。接著JITCompiler驗(yàn)證IL代碼,并將IL代碼編譯為本地CPU命令。本地CPU命令被保存到一個(gè)動(dòng)態(tài)分配的內(nèi)存塊中。然后JITCompiler返回CLR為類型創(chuàng)建的內(nèi)部數(shù)據(jù)結(jié)構(gòu),找到與調(diào)用方法對(duì)應(yīng)的那一條記錄,修改最初對(duì)JITCompiler的引用,讓他現(xiàn)在指向內(nèi)存塊中的代碼(WriteLine(string)的具體實(shí)現(xiàn))。這些代碼執(zhí)行完畢并返回時(shí),會(huì)返回到Main中的代碼,然后繼續(xù)執(zhí)行。

  當(dāng)執(zhí)行到Console.WriteLine("World");時(shí),Main要再次調(diào)用WriteLine(string)。這時(shí),因?yàn)橹耙呀?jīng)對(duì)WriteLine(string)的代碼進(jìn)行了驗(yàn)證和編譯,所以會(huì)直接執(zhí)行內(nèi)存塊中的代碼,WriteLine("World")執(zhí)行完畢后,再次回到Main。

4.2 JITter

  JIT編譯器并不是把整個(gè)程序一次編譯完,而是只編譯它調(diào)用的那部分代碼。代碼編譯過一次后,得到的內(nèi)部可執(zhí)行代碼就存儲(chǔ)起來,直到應(yīng)用程序終止,編譯好的代碼就才會(huì)丟失。所以,如果再次運(yùn)行程序,或者啟動(dòng)了程序的兩個(gè)實(shí)例(使用兩個(gè)不同的進(jìn)程),JIT編譯器都要再次編譯IL。一個(gè)方法只有在首次調(diào)用時(shí)才會(huì)造成一些性能損耗,之后對(duì)該方法的所有調(diào)用都以本地代碼的形式全速運(yùn)行。由于編譯過程的最后一部分是在運(yùn)行時(shí)進(jìn)行的,JIT編譯器能夠確切地知道程序運(yùn)行在什么類型的處理器上,可以利用該處理器提供的任何特性或特定的機(jī)器代碼指令來優(yōu)化最后的可執(zhí)行代碼,以提高性能。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
CLR VIA C#之旅(1):品味細(xì)節(jié),CLR的執(zhí)行模型
CLR基礎(chǔ)之一---認(rèn)識(shí)CLR [《CLR via C#》讀書筆記]
NET基礎(chǔ)
[你必須知道的.NET] 第七回:品味類型---從通用類型系統(tǒng)開始
什么是CTS、CLS和CLR_爛筆頭
全面認(rèn)識(shí).NET框架(一)
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服