CLR vir C# 之類型與成員基礎

來源:互聯網
上載者:User

     1.Class的可見度分為public和internal.

          public:在任意assembly中可見,internal:僅在所在Assembly中可見。

          如果不做定義,預設為Internal.

     2.成員的存取層級

          存取層級的定義在C#和CLR中的定義有所不同。

    

CLR術語 C#術語
Private private
Family protected
Family and Assembly 不支援
Assembly internal
Family or Assembly protected internal
Public public

 

     成員預設為Private(私人)。

     對於繼承關係的類之間,C#規定繼承類重寫父類方法,存取層級必須一致。而CLR則沒有此限制,只要求重寫方法的存取層級高於虛方法即可。

     3.靜態類

     Static用來定義靜態類。靜態類通常用來定義一組具有相同使命的方法(或屬性等成員),這些方法當然必須都是靜態,public的。

     比如Math, Console等類的使用。

     Static只能用於Class,不能用於Struct.

     靜態類不能被執行個體化,直接繼承與System.Object.不能實現任何介面;

     從MSIL可見,靜態類編譯為IL後,以abstract sealed定義出現。

     4.部分類,結構,介面

     通常在出現下面情況時,會用到partial關鍵字。

     1)多人同時開發時。此時可把一個類,寫在多個檔案中,供多人同時開發。

     2)winform, webform的實現機制。當我們拖動控制項時,vs幫我們把自動產生的程式碼放在單獨的檔案中(.desinger.cs),而對於後台編程代碼放在另一個單獨檔案中,單可以看到,他們是屬於一個類的,用Partial標記。

     要說明的是,partial只在C#中定義,CLR不知道它的存在。所以同一類型的源碼應該用統一程式設計語言實現。

      5.IL指令:Call,Callvirt

     可以在類型中定義靜態方法,虛方法,執行個體方法。

     當在程式中調用這些方法時,會在IL中調用相應的IL指令。

     通常,call指令可以調用靜態方法,虛方法,執行個體方法;callvirt可以調用虛方法和執行個體方法,callvirt調用前會進行為空白性檢查,效能比call要差些。

     C#中,靜態方法由call調用,虛方法和執行個體方法由callvirt調用。

     

Code
using System;
using System.Collections.Generic;
using System.Text;

namespace Demo1
{
   public  class AccessDemo
    {
        static void Main()
        {
            Aclass.f();
            Aclass a = new Aclass();
            a.f1();
            a.f2();
        }
    }

    class Aclass
    {
      public static void f()
        {   
        }

        public void f1()
        {
        }

        public virtual void f2()
        {
        }
    }
}

 MSIL:

Code
.method private hidebysig static void Main() cil managed
{
    .entrypoint
    .maxstack 1
    .locals init (
        [0] class Demo1.Aclass a)
    L_0000: nop 
    L_0001: call void Demo1.Aclass::f()
    L_0006: nop 
    L_0007: newobj instance void Demo1.Aclass::.ctor()
    L_000c: stloc.0 
    L_000d: ldloc.0 
    L_000e: callvirt instance void Demo1.Aclass::f1()
    L_0013: nop 
    L_0014: ldloc.0 
    L_0015: callvirt instance void Demo1.Aclass::f2()
    L_001a: nop 
    L_001b: ret 
}

 

     

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.