目錄
正文
回到頂部[x] 工作不久換工作同學
大牛看到估計是下面這張圖的這個表情了,所以,可以在評論區給給意見啦233。
廢話少說,直入正題:
1.若要循環訪問集合,集合必須滿足特定的要求。
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'.
封裝詳解:
也就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。
繼承詳解:
繼承概念的實現方式有三類:實現繼承、接口繼承和可視繼承
實現多態,有二種方式,覆蓋,重載:
那麼,多態的作用是什麼呢?
我們知道,封裝可以隱藏實現細節,使得代碼模塊化;繼承可以擴展已存在的代碼模塊(類);它們的目的都是為了——代碼重用。而多態則是為了實現另一個目的——接口重用!多態的作用,就是為了類在繼承和派生的時候,保證使用“家譜”中任一類的實例的某一屬性時的正確調用。
最常見的一類非托管資源就是包裝操作系統資源的對象,例如文件,窗口或網絡連接,對於這類資源雖然垃圾回收器可以跟蹤封裝非托管資源的對象的生存期,但它不了解具體如何清理這些資源。還好.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,接著處理如下:
1、aspnet_isapi.dll則會 通過一個Http PipeLine的管道將這個Http請求發給w3wp.exe(iis 工作者進程,IIS6.0中叫做 w3wq.exe,IIS5.0中叫做 aspnet_wp.exe),之後asp.net framework就會通過HttpRuntime來處理這個Http請求。
2、HttpRuntime首先會確定處理該請求的類名,HttpRuntime通過公共接口IHttpHandler來調用該類獲取被請求資源的類的實例。
3、調用HttpRuntime.ProcessRequest開始處理要發送到浏覽器的頁面,具體說就是創建一個HttpContext實例,它封裝了所有與請求有關的http特有的信息,並初始化一個Write對象用於緩存標記代碼。
4、HttpRuntime使用上下文信息查找或新建能處理該請求的WEB應用程序的對象。由HttpApplication Factory負責返回HttpApplication實例。
5、HttpApplication實例會讀取web.config中所有HttpModule的配置。
6、HttpApplication對象使用IHttpHandlerFactory類型的實例返回HttpHandler(http處理程序)給HttpRuntime對象。一個頁面只是個http處理程序對象。
7、最後由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();
}
}
}
當你自認為做出了不錯的功能但描述出來時又支支吾吾的時候,不要為自己說不出來而懊惱,因為不是你發揮有問題,更不要向別人解釋用了啥高大上插件,別讓自己成為接口程序員,請靜下心回去補補基礎。