CLR筆記(二)

 

6.型和成

1.Class的可性有publicinternalpublic所有程序集都可internal僅對其所在的程序集可。默public的。

  2.友元程序集,

  使用friend assembly可以實現單測試,而不使用反射技

  的是按照命令行編譯

  我測試用的是vs2005solution,如下:

  3.的可訪問

  成private的,接口型的成都是public的。

  子重寫父的成員時,原始成與重寫成要有相同的可訪問——C#束;CLR束是,重寫成的可訪問性不能更低。

  CLRC#是不一的,如表:

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


  4.態類

  static只能用於class,不能用於struct,因CLR要求須實例化,而且不能控制例化程。

  C#態類束:

  靜態類直接從System.Object派生

  靜態類不能實現任何接口

  靜態類只能定:字段,方法,屬性,事件

  靜態類不能用作:字段,方法,參數,局部量。

  在MSIL中,不會態類生成ctor,會將其標記爲abstractsealed

  5.部分

   CLR不支持partial,只是C#法。所以某個型的源使用同一種編

  6.件,多和版本控制

  .NET版本號2.7.1.34,包含4個部分:主版本號,次版本號,內部版本號,修版本號。

   修版本,向後兼容,改內部/版本號;

   布新版本,不向後兼容,改/次版本號。

  多中,子重寫父的虛方法,會引起版本控制問題,即父類發生改,其版本低於子版本,會致子爲變化。

  C# 5個用於 / 的 影響件版本控制 的 關鍵字:

   abstract:用於/

   virtualoverride:用於成

   sealed:用於/。用於成員時用於重寫了虛方法的方法。

   new,用於//常量/字段

  C#調用虛方法:

   CLR許類中定多個"同名方法"僅僅是返回型不同,IL許這樣做;C#不允,忽略返回型,相的用"轉換操作符"實現IL中的"同名方法"

   調用方法相MSIL

   一個是call,用來調用靜方法,例方法和虛方法。必要指定調用方法的(於靜方法)或者(例方法/虛方法),如果在該類/象中找不到方法,會檢查其基來匹配方法。

   另一個是callvirt,用來調例方法和虛方法,不能用於調用靜方法。必要指定調用方法的象,如果null,會拋出NullReferenceException異常,意味着調用前都會有外的null檢查,從而比調call慢一些。

   如下代所示:

    public sealed class Program
    {
        public Int32 GetFive()
        {
            return 5;
        }

        public static void Main()
        {
            Program p = null;
            Int32 x = p.GetFive();  //C#,使用callvirt,會拋出NullReferenceException異常
        }
    }

   C#編譯器中,使用callvirt調用所有例方法(包括虛方法),使用call調用所有靜方法。於其他的編譯器,一點不能保,所以在虛方法和非虛方法之而不重新編譯,會生無法預測問題

   C#使用call而不用callvirt調用虛方法的特例:ToString下:

    internal class SomeClass
    {
        public override string ToString()
        {
            return base.ToString();
        }
    }

   這時候,生成callIL。因如果使用callvirt,意味着這時一個虛方法,從而遞歸執方法,直到AppDomain的堆溢出。

   在調值類型定的方法,使用call是因,首先,值類型是密封的,從而不存在虛方法;另外,值類型永不會null,所以永不會拋出NullReferenceException異常;再者,如果使用callvirt,就要使用裝箱機制,性能會有極大影響。

   在設計class程中,要儘量少定虛方法。取代法:可以定方法,其中最複雜的方法虛化,而將所有有用的重非虛化,示例如下:

    public class Set
    {
        private Int32 m_length = 0;

        //個有用的重是非虛
        public Int32 Find(Object value)
        {
            return Find(value, 0, m_length);
        }

        //個有用的重是非虛
        public Int32 Find(Object value, Int32 startIndex)
        {
            return Find(value, 0, m_length - startIndex);
        }

        //功能最豐富的方法是虛,可以被重寫
        public Int32 Find(Object value, Int32 startIndex, Int32 endIndex)
        {
            .//具體
實現
        }
    }

   sealed閉類儘量使用。將sealed非密的容易,反之困;性能也快,因sealed一定是非虛的,從而編譯器不用考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章