廢話少說,直入正題:css
區別 | 詳解 |
---|---|
賦值時的區別 | 值類型的變量將直接得到一個真實的數據副本,初值爲0;而對引用類型的賦值僅僅是把對象的引用賦給變量,這樣就可能致使多個變量引用到一個實際對象實例上,初值爲null。 |
內存分配的區別 | 值類型的對象會在堆棧上分配內存,而引用類型的對象將會在堆上分配內存。堆棧的控件相對有限,但運行效率卻比堆高得多。 |
來自繼承結構的區別 | 因爲全部的值類型都有一個共同的基類:System.ValueType,因此值類型擁有一些引用類型不具備的共同性質。較爲重要的一點是值類型的比較方法Equals 方法的實現有了改變。全部的值類型已經實現了內容的比較,而引用類型在沒有重寫Equals方法的狀況下,仍然採用引用比較。 |
1.若要循環訪問集合,集合必須知足特定的要求。html
2.有三種使用集合的方法:前端
// cs_sealed_keyword.cs using System; sealed class SealedClass { public int x; public int y; } class MainClass { static void Main() { SealedClass sc = new SealedClass(); sc.x = 110; sc.y = 150; Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y); } } 輸出 x = 110, y = 150 在前面的示例中,若是試圖經過使用下面的語句從密封類繼承: class MyDerivedC: MyClass {} // Error 將收到錯誤信息: 'MyDerivedC' cannot inherit from sealed class 'MyClass'.
名詞 | 簡介 |
---|---|
封裝 | 封裝是面向對象的特徵之一,是對象和類概念的主要特性。 |
封裝詳解:java
也就是把客觀事物封裝成抽象的類,而且類能夠把本身的數據和方法只讓可信的類或者對象操做,對不可信的進行信息隱藏。程序員
名詞 | 簡介 |
---|---|
繼承 | 面向對象編程 (OOP) 語言的一個主要功能就是「繼承」。繼承是指這樣一種能力:它可使用現有類的全部功能,並在無需從新編寫原來的類的狀況下對這些功能進行擴展。 |
繼承詳解:web
繼承概念的實現方式有三類:實現繼承、接口繼承和可視繼承面試
名詞 | 簡介 |
---|---|
多態 | 多態性(polymorphisn)是容許你將父對象設置成爲和一個或更多的他的子對象相等的技術,賦值以後,父對象就能夠根據當前賦值給它的子對象的特性以不一樣的方式運做。簡單的說,就是一句話:容許將子類類型的指針賦值給父類類型的指針。 |
實現多態,有二種方式,覆蓋,重載:算法
那麼,多態的做用是什麼呢?數據庫
咱們知道,封裝能夠隱藏實現細節,使得代碼模塊化;繼承能夠擴展已存在的代碼模塊(類);它們的目的都是爲了——代碼重用。而多態則是爲了實現另外一個目的——接口重用!多態的做用,就是爲了類在繼承和派生的時候,保證使用「家譜」中任一類的實例的某一屬性時的正確調用。編程
最多見的一類非託管資源就是包裝操做系統資源的對象,例如文件,窗口或網絡鏈接,對於這類資源雖然垃圾回收器能夠跟蹤封裝非託管資源的對象的生存期,但它不瞭解具體如何清理這些資源。還好.net Framework提供了Finalize()方法,它容許在垃圾回收器回收該類資源時,適當的清理非託管資源。若是在MSDN Library 中搜索Finalize將會發現不少相似的主題,
這裏列舉幾種常見的非託管資源:ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen,Regex,Socket,StreamWriter,Timer,Tooltip 等等資源。可能在使用的時候不少都沒有注意到!
你定義了一個變量的引用str
string str=null 把這個引用指向了一個null,沒有地址沒有值的地方,即沒分配內存空間
string str="" 把這個引用指向了一個地址,地址裏面存的是空的字符,即佔用了內存空間
簡述:String 在進行運算時(如賦值、拼接等)會產生一個新的實例,而 StringBuilder 則不會。
因此在大量字符串拼接或頻繁對某一字符串進行操做時最好使用 StringBuilder,不要使用 String
另外,對於 String 咱們不得很少說幾句:
1.它是引用類型,在堆上分配內存
2.運算時會產生一個新的實例
3.String 對象一旦生成不可改變(Immutable)
4.定義相等運算符(== 和 !=)是爲了比較 String 對象(而不是引用)的值
總結:
StringBuilder採用構造器設計模式的思想高效地構造一個字符串對象,在構造過程當中StringBuilder 能夠有效的避免臨時字符串對象的生成。一旦 StringBuilder的ToString方法被調用後,最終的字符串就被生成,而隨後的操做將致使一個新的字符串對象的分配。由於字符串對象的不可修改特性,StringBuilder還常常被用來和非託管代碼交互。
簡述:經過流類型能夠方便地操做各類字節流,但如何把現有的實例對象轉換爲方便傳輸的字節流,就須要用到序列化的技術。
簡述:BASE64編碼是一種用於混淆明碼的編碼方式,其算法是把原先8位字節數組順序分配到新的6位字節數組中,再在每一個字節的高2位填充0來組成新的8位字節數組。.NET中Convert 類型能夠用來進行Base64字符串和8位字節數組之間的轉換。
簡述: 一旦使用了字符串池機制,當CLR啓動的時候,會在內部建立一個容器,容器的鍵是字符串內容,而值是字符串在託管堆上的引用。當一個新的字符串對象須要分配時,CLR首先檢測內部容器中是否已經包含了該字符對象,若是已經包含,則直接返回已經存在的字符串對象引用:若是不存在,則新分配一個字符串對象,同時把其添加到內部容器裏去。可是當程序用new關鍵字顯式地申明新分配的一個字符串對象時,該機制不會起做用。
簡述: .NET 內建類型中提供了 FileInfo 和 DirectoryInfo 兩個類型,分別用來操做文件和文件夾。有別於 File 和 Directory 類型, FileInfo 和 Directory 主要的功能在於操做文件和文件夾在文件系統中的結構,完成諸如建立、複製、讀取信息、移動、判斷是否存在、刪除等功能。
簡述: 使用 TryParse 能夠避免異常。
示例 string time="2013-02-02"; DateTime t; if(DateTime.TryParse(s,out t)) { //輸出 }
static bool ReferenceEquals(object A ,object B) static bool Equals(object A ,object B) virtual bool Equals(object obj)
1.ReferenceEquals 實現了類型的引用比較,從參數類型能夠看出,它不只能夠用來比較兩個引用類型對象,也能夠用來比較兩個值類型對象。
固然,ReferenceEquals 方法只有應用在引用類型上時纔會有意義,比較值類型的引用將永遠返回false,不管他們的值是否相等。甚至與下面的例子:
int i=0; Console.WriteLine(Object.ReferenceEquals(i,i));
解釋:由於上面的兩個i都是先進行裝箱,而後傳遞給ReferenceEquals 方法。
2.Equals 是另一個靜態比較方法,它實現的功能根據不一樣的類型而有所不一樣。事實上,Equals 方法的功能依靠了實例Equals 方法的實現,歸納地講,靜態 Equals 方法的內容分爲兩步:首先檢查兩個對象是否恆等 (==),而後調用其中一個參數對象的實例 Equals 方法來判斷兩個對象是否恆等。
簡述:
簡述:委託是一類繼承自 System.Delegate的類型, 每一個委託對象至少包含了一個指向某個方法的指 針,該方法能夠是實例方法,也能夠是靜態方法。委託實現了回調方法的機制,可以幫助程序員 設計更加簡潔優美的面向對象程序。
簡述:委託回調靜態方法和實例方法有何區別 當委託綁定靜態方法時,內部的對象成員變量 _target將會被設置成 null,而當委託綁定實例 方法時, _target 將會設置成指向該實例方法所屬類型的一個實例對象, 當委託被執行時, 該對象 實例將被用來調用實例方法。
簡述:鏈式委託是指一個委託的鏈表,而不是指另外一類特殊的委託。 當執行鏈上的一個方法時,後續委託方法將會被依次執行。System.Multicast Delegate定 義了對鏈式委託的支持。在System.Delegate的基礎上,它增長了一個指向後續委託的指針,這樣就實現了一個簡單的鏈表結構。
也就是說:瀏覽器和服務器軟件其實就是兩個使用Socket進行通訊的的兩個應用程序:雙方都發送按照 Http協議語法規範組織的數據,接收到數據後都按照 Http協議語法規範來解釋。
上圖就是IIS (服務器軟件)
1.瀏覽器和IIS交互過程:
咱們都知道,在互聯網上肯定一臺電腦的位置是使用IP尋址,但爲何當咱們平時訪問網站時直接輸入一個域名也可以訪問到某個服務器電腦進而由對方的服務器軟件發送響應頁面數據給我呢?下面我把簡單步驟列出:
(1)在瀏覽器輸入網址:www.oumind.com/index.html,瀏覽器按照Http協議語法 生成請求報文數據。
(2).瀏覽器檢查本機是否保存了www.oumind.com/index.html.域名對應的服務器IP地址。若是沒有,則發送請求到所在城市網中最近的DNS服務器(域名解析服務器),它會根據咱們發送來的域名查詢到該域名對應的服務器IP地址,併發送回瀏覽器。
(3)瀏覽器從DNS服務器得到了 www.oumind.com/index.html域名對應的服務器電腦IP,則將 請求報文 經過Socket發送到服務器電腦。(注意:Http協議 規定服務器軟件使用的默認端口是80,通俗的說,就是若是瀏覽器訪問一個網站頁面,瀏覽器默認就是將 請求報文 發送到服務器80端口,而服務器負責監聽這個端口的軟件通常就是服務器軟件—好比asp.net用的IIS,java用的Tomcat。)
(4)IIS接收到 請求報文,分析請求報文,從中獲取請求的頁面路徑 /index.html。判斷頁面的後綴名,若是是靜態頁面(.html/.jpg/.css/.js等),則直接由IIS軟件的組件讀取該文件內容,並將內容經過Socket發送回瀏覽器。
(5)但若是此時請求的是一個動態頁面(.aspx/.ashx),IIS本身就處理不了 (由於IIS軟件開發出來的時候,ASP.NET程序還不存在呢) 。因此,IIS就去它的 擴展程序映射表 中根據被請求文件後綴名 查看是否有可以處理這種文件的擴展程序。
而咱們ASPNET中經常使用的文件.aspx/.ashx等 對應的處理程序是aspnet_isapi.dll。以下圖:
(6)若是IIS根據後綴名找到對應的處理程序,則經過調用此程序來處理瀏覽器發送來的請求報文。
IIS自身是不能處理像ASPX擴 展名這樣的頁面,只能直接請求像HTML這樣的靜態文件,之因此能處理ASPX這樣擴展名的頁面,是由於IIS有一個ISAPI過濾器,它是一個COM組件。
ASP.NET服務在註冊到IIS的時候,就會添加一個Win32的擴展動態庫aspnet_isapi.dll。並將擴展能夠處理的頁面擴展名(如 ASPX)註冊到IIS裏面。擴展啓動後,就根據定義好的方式來處理IIS所不能處理的頁面。
當客戶端請求一個服務器資源時,這個HTTP請求會被inetinfo.exe進程截獲(www服務),而後Check請求資源的類型,並依據資源映射信息(存儲在IIS元庫中,一種IIS專用的配置數據庫)將請求的資源分配給特定的處理程序模塊。若請求的是靜態資源(img,text,html等)則由IIS處理(IIS在本地Web Server上訪問請求的文件),將內容輸出到控制檯,發出請求的瀏覽器就能接收到它了。
若須要在服務器端處理的請求,則會被傳到已註冊的擴展模塊 中,aspx請求會被分配給aspnet_isapi.dll,讓這個程序開始處理代碼,生成標準的HTML代碼,而後將這些HTML加入到原有的 HTML中,最後把完整的HTML返回給IIS,IIS再把內容發送到客戶瀏覽器。
ASP.NET FrameWork對請求的處理:
上面說到IIS將像ASPX這樣的頁面分配給aspnet_isapi.dll,接着處理以下:
一、aspnet_isapi.dll則會 經過一個Http PipeLine的管道將這個Http請求發給w3wp.exe(iis 工做者進程,IIS6.0中叫作 w3wq.exe,IIS5.0中叫作 aspnet_wp.exe),以後asp.net framework就會經過HttpRuntime來處理這個Http請求。
二、HttpRuntime首先會肯定處理該請求的類名,HttpRuntime經過公共接口IHttpHandler來調用該類獲取被請求資源的類的實例。
三、調用HttpRuntime.ProcessRequest開始處理要發送到瀏覽器的頁面,具體說就是建立一個HttpContext實例,它封裝了全部與請求有關的http特有的信息,並初始化一個Write對象用於緩存標記代碼。
四、HttpRuntime使用上下文信息查找或新建能處理該請求的WEB應用程序的對象。由HttpApplication Factory負責返回HttpApplication實例。
五、HttpApplication實例會讀取web.config中全部HttpModule的配置。
六、HttpApplication對象使用IHttpHandlerFactory類型的實例返回HttpHandler(http處理程序)給HttpRuntime對象。一個頁面只是個http處理程序對象。
七、最後由HttpRuntime對象調用IHttpHandler的頁面對象的ProcessRequest方法。
在C#程序中,沒有全局變量的概念,這意味着全部的成員變量只有該類的實例才能操做這些數據,這起到了「信息隱藏」的做用。但有些時候,這樣作卻不是個明智的選擇。
靜態變量的聲明方式以下:
[訪問修飾符] static 數據類型 變量名;
這裏的訪問修飾符跟類的其它成員同樣,能夠是public,protected,private或internal等。
靜態變量必須使用類名來引用,而不能使用類的實例,由於,靜態變量不屬於任何實例,而是共有的。
舉個具體的例子以下:
using System; class StaticVar { public int x; public static int y; public void PrintInfo() { Console.WriteLine("非靜態變量x={0}",x); Console.WriteLine("靜態變量y = {0}",y); } } class Test { static void Main(string[] args) { StaticVar stv = new StaticVar(); stv.x = 10; // stv.y = 20; //error;沒法使用實例引用訪問靜態成員「StaticVar.y」;改用類型名來限定它 StaticVar.y = 20; stv.PrintInfo(); } }
程序中被註釋的部分:stv.y = 20是使用實例引用靜態變量,這將引起錯誤。
另外,我想說一句,對於靜態變量在聲明時,若是沒有給出初始值或使用前沒有賦任何值的話,系統會給他們一個默認值:對於整型數據默認值爲0;單精度數據爲:0.0f;雙精度數據爲0.0;布爾型數據爲False;引用型數據爲null。
靜態方法與靜態變量同樣,不屬於任何特定的實例,屬於類全體成員共有,由類名來調用。
但要注意如下幾點:
這裏用一個具體的例子來講明:
using System; namespace TestStatic { class StaticTest { int x; static int y; public StaticTest(int a,int b) { x = a; y = b; } public void SimplePrint() { Console.WriteLine("x="+x+",y="+y); } public static void StaticPrint() { Console.WriteLine("y={0}",y); // Console.WriteLine("x={0}",x); //靜態方法中不能使用非靜態成員 } } class Test { static void Main(string[] args) { StaticTest st = new StaticTest(10,23); st.SimplePrint(); //st.StaticPrint(); //靜態方法不能使用實例來調用 StaticTest.StaticPrint(); } } }