CLR Via C#: 類型基礎

全部類型都從System.Object派生安全

  • 一下兩個類型定義是徹底一致的
class Employee
    { }
class Employee : System.Object
    { }
  • 因爲全部類型最終都從System.Object派生,因此能夠保證每一個類型的每一個對象都有一組最基本的方法。公共實例方法:
    • Equals
    • GetHashCode
    • ToString
    • GetType
  • 從System.Object派生的類型能訪問的受保護方法:
    • MemberwiseClone
    • Finalize

 

CLR要求全部對象都用new操做符來建立:ui

Employee e = new Employee();
  •  new操做符所作的事情
    • 計算類型及其全部基類型中定義的全部實例字段須要的字節數
    • 它從託管堆中分配指定類型要求的字節數,從而分配對象的內存,分配的全部字節都設爲零
    • 它初始化對象的「類型對象指針」和「同步塊索引」成員
    • 調用類型的實例構造器,向其傳入在對new的調用中指定的任何實參。
  • new在執行了全部這些操做後,會返回指向新建對象一個引用(或指針)。在前面的示例代碼中,這個引用會保存到變量e中。
  • 沒有和new操做符對應的一個delete操做符,換言之,沒有辦法顯示釋放爲一個對象分配的內存。CLR採用了垃圾回收機制,能自動檢測到一個對象再也不被使用或訪問,並自動釋放對象的內存。

 

類型轉換:spa

  • CLR容許將一個對象轉換爲它的(實際)類型或者它的任何基類型。C#不要求任何特殊語法便可將一個對象轉換爲它的任何基類型,由於向基類型的轉換被認爲是一種安全的隱式轉換。然而將對象轉換爲它的某個派生類型時,C#要求開發人員只能進行顯示轉換。
Object o = new Employee();

Employee e = (Employee)o;
  • 使用C#的is和as操做符來轉型
    • is檢查一個對象是否兼容於指定的類型,並返回一個Bollean值: true 或false。is操做符永遠不會拋出異常。
Object o = new Object();
if (o is Employee)
{
 Employee e = (Employee)o;
}
    •   在這段代碼中,CLR 實際會檢查兩次對象的類型。if條件一次;if語句內部一次。as操做符簡化了這種代碼的寫法:
Object o = new Object();
Employee e = o as Employee;
if (e != null)
{

 }
    •   在上面這段代碼中,CLR 覈實o是否兼容於Employee類型,若是是,as會返回對同一個對象的非null的引用。若是不是,as會返回null。as操做符形成CLR只校驗一次對象的類型。

 

命名空間和程序集:指針

命名空間(namespace)用於對相關的類型進行邏輯性分組。code

namespace ConsoleApplication1
{
    public sealed class Program
    {
        public static void Main(string[] args)
        {
            string path="";
            System.IO.FileMode fm = new System.IO.FileMode();
            System.IO.FileStream fs = new System.IO.FileStream(path,fm);
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
        }
    }
}
using System.IO;
using System.Text;

namespace ConsoleApplication1
{
    public sealed class Program
    {
        public static void Main(string[] args)
        {
            string path="";
            FileMode fm = new FileMode();
            FileStream fs = new FileStream(path,fm);
            StringBuilder sb = new StringBuilder();
        }
    }
}

C#的using指令還支持另外一種形式,容許爲一個類型 或命名空間建立別名。對象

using WintellectWidget = Wintellect.Widget;

 

命名空間和程序集的關係:blog

  • 同一個命名空間中的各個類型多是再不一樣的程序集中實現的
  • 在一個程序集中,也可能包含不一樣命名空間中的類型
  • 在.NET Framework SDK文檔中查找一個類型時, 文檔會明確的指出類型所屬的命名空間,以及實現了該類型的程序集
相關文章
相關標籤/搜索