.Net knowledge Note I

★什麼是強類型,什麼是弱類型?哪種更好些?

   強/弱類型是指類型檢查的嚴格程度的。語言有無類型,弱類型和強類型三種。無類型的不檢查,甚至不區分指令和數據。弱類型的檢查很弱,僅能嚴格的區分指令和數據。強類型的則嚴格的在編譯期進行檢查。

   使用哪種語言還是要按需而定。編寫簡單小應用,使用弱類型語言可節省很多代碼量,有更高的開發效率。而對於構建大型項目,使用強類型語言可能會比使用弱類型更加規範可靠。

------------------------

★全局程序集緩存GAC:概念

GAC全稱是Global   Assembly   Cache,他的作用是可以存放一些有很多程序都要用到的公共Assembly,例如System.Data、System.Windows.Forms等等。這樣,很多程序就可以從GAC裏面取得Assembly,而不需要再把所有要用到的Assembly都拷貝到應用程序的執行目錄下面。這樣取用方便,也有利於Assembly的升級和版本控制。

 

------------------------

★ PID:概念 

      PID(進程控制符)英文全稱爲Process Identifier,它也屬於電工電子類技術術語。

  PID就是各進程的身份標識,程序一運行系統就會自動分配給進程一個獨一無二的PID。進程中止後PID被系統回收,可能會被繼續分配給新運行的程序。

  PID一列代表了各進程的進程ID,也就是說,PID就是各進程的身份標識。

------------------------

C# 對象深拷貝、淺銬貝、直接拷貝

C#中有兩種類型變量,一種是值類型變量,一種是引用類型變量。對於前者,copy是屬於全盤複製;而對於後者,一般的copy只是淺copy,相當於只傳遞一個引用指針一樣。因此對於後者進行真正copy的時候,也是最費事的,具體的說,必須爲其實現ICloneable接口中提供的Clone方法。

  淺拷貝(影子克隆):只複製對象的基本類型,對象類型,仍屬於原來的引用.
  深拷貝(深度克隆):不緊複製對象的基本類,同時也複製原對象中的對象.就是說完全是新對象產生的.

 

淺拷貝和深拷貝之間的區別:淺拷貝是指將對象中的數值類型的字段拷貝到新的對象中,而對象中的引用型字段則指複製它的一個引用到目標對象。如果改變目標對象中引用型字段的值他將反映在原是對象中,也就是說原始對象中對應的字段也會發生變化

深拷貝與淺拷貝不同的是對於引用的處理,深拷貝將會在新對象中創建一個新的和原是對象中對應字段相同(內容相同)的字段,也就是說這個引用和原是對象的引用是不同的,我們在改變新對象中的這個字段的時候是不會影響到原始對象中對應字段的內容。所以對於原型模式也有不同的兩種處理方法:對象的淺拷貝和深拷貝。

淺拷貝:

    MemberwiseClone 方法創建一個淺表副本,方法是創建一個新對象,然後將當前對象的非靜態字段複製到該新對象。如果字段是值類型的,則對該字段執行逐位複製。如果字段是引用類型,則複製引用但不復制引用的對象;因此,原始對象及其複本引用同一對象。

深拷貝:

   即實現ICloneable接口.ICloneable可用於深拷貝和淺拷貝。

 

在實際中一般都是採用序列化A,然後將序列化的結果反序列化得到B來實現深層拷貝的目的。

------------------------

★命名空間與裝配件的關係
Assembly是一個程序集相關的靜態類,保存了程序集的信息   //此敘述不一定正確
Assembly的主要用處是:
ⅰ與反射Reflection結合起來用,動態創建你所需要的類!!
ⅱ與反射Reflection結合起來用,獲得Assemble裏類的信息
(據可靠的小道消息說Assembly裏存的是一張包含元數據類名什麼的表)
ⅲ使用別人已封裝好的類.
     裝配件是.Net應用程序執行的最小單位,編譯出來的.dll、.exe都是裝配件。
     裝配件和命名空間的關係不是一一對應,也不互相包含,一個裝配件裏面可以有多個命名空間,一個命名空間也可以在多個裝配件中存在.

     Type.GetType屬於Reflection的一部分,Reflection可以用於動態解析類型。也就是說,即使編譯開發期間沒有建立對Assembly的引用,Type.GetType一樣可以用於取得類型信息(相反,typeof是靜態解析類型的,所以要求reference)。
     Type.GetType:  單從類型的名稱(包括Namespace部分)是不可能找到類型定義的,還必須知道定義類型的Assembly的名稱和位置。所以在調用Type.GetType的時候必須要附帶指明Assembly的信息。

如何使用反射獲取類型
如何獲得類型信息:
     獲得類型信息有兩種方法,一種是得到實例對象
     這個時侯我僅僅是得到這個實例對象,得到的方式也許是一個object的引用,也許是一個接口的引用,但是我並不知道它的確切類型,我需要了解,那麼

就可以通過調用System.Object上聲明的方法GetType來獲取實例對象的類型對象,比如在某個方法內,我需要判斷傳遞進來的參數是否實現了某個接口,如果

實現了,則調用該接口的一個方法:

public   void   Process(   object   processObj   )
{
Type   t   =   processsObj.GetType();
if(   t.GetInterface(“ITest”)   !=null   )
                    …
}

        另外一種獲取類型的方法是通過Type.GetType以及Assembly.GetType方法,如:
              Type   t   =   Type.GetType(“System.String”);
        需要注意的是,前面我們講到了命名空間和裝配件的關係,要查找一個類,必須指定它所在的裝配件,或者在已經獲得的Assembly實例上面調用

GetType。
        本裝配件中類型可以只寫類型名稱,另一個例外是mscorlib.dll,這個裝配件中聲明的類型也可以省略裝配件名稱(.Net裝配件編譯的時候,默認都

引用了mscorlib.dll,除非在編譯的時候明確指定不引用它),比如:
          System.String是在mscorlib.dll中聲明的,上面的Type   t   =   Type.GetType(“System.String”)是正確的
          System.Data.DataTable是在System.Data.dll中聲明的,那麼:
Type.GetType(“System.Data.DataTable”)就只能得到空引用。
          必須:
Type   t   =   Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0,   Culture=neutral,   PublicKeyToken=b77a5c561934e089");

------------------------

------------------------

發佈了68 篇原創文章 · 獲贊 16 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章