《CLR.via.C#第三版》第二部分第6,7章節讀書筆記(三)

杭偉發表於2014-11-10

第6章講的是型別和成員基礎

重要認知:虛方法

虛方法的設計原則:設計一個型別時,應儘量減少所定義的虛方法的數量。

      首先,呼叫虛方法的速度比呼叫非虛方法慢。

      其次,JIT編譯器不能內嵌虛方法,這進一步影響了效能。

      第三,虛方法使元件的版本控制變得更脆弱。

      第四,定義一個基類時,如果希望一些方法是多型的,最好的辦法是使複雜的辦法成為虛方法,簡便的成為非虛方法。

引申到定義類時應遵循的原則:

      1. 定義類時,除非確定要將此類作為基類使用,否則總是顯示指定為sealed類;
      2. virtual永遠最後才考慮,因為virtual成員會放棄許多控制,喪失獨立性,過於依賴派生類的正確行為;

關於虛方法的程式碼示例:(如果沒有註釋,你"猜對"了嗎?)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CATest101
{
    public class A
    {
        public void MethodF()
        {
            Console.WriteLine("A.F");
        }
        public virtual void MethodG()
        {
            Console.WriteLine("A.G");
        }
    }

    public class B : A
    {
        new public void MethodF()
        {
            Console.WriteLine("B.F");
        }
        public override void MethodG()
        {
            Console.WriteLine("B.G");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            B b;
            b = new B();
            A a = b;//定義A型別的變數a,並指向b物件的例項
            a.MethodF(); //輸出A.F
            b.MethodF(); //輸出B.F
            a.MethodG(); //輸出B.G
            b.MethodG(); //輸出B.G
        }
    }
}
View Code

知識點:const靜態常量和readonly動態常量
1)const修飾的常量在宣告的時候必須初始化;readonly修飾的常量則可以延遲到建構函式初始化
2)const修飾的常量在編譯期間就被解析,即常量值被替換成初始化的值;readonly修飾的常量則延遲到執行的時候
此外const常量既可以宣告在類中也可以在函式體內,但是static readonly常量只能宣告在類中。
更對關於const和readonly請看這個連結,我覺得作者講的不錯。

相關文章