C#三大方法:虛方法、靜態方法、實例方法


虛方法:使用virtual關鍵字定義,當子類繼承父類時,可以對父類中的虛方法進行重寫。

如下面代碼中的類B,它繼承類A,類A實現了接口I(實現了接口中的foo()方法)。在類A中使用virtual將foo()方法定義為虛方法,故在子類B中就可以重寫foo()方法。這樣就不會執行類A中的foo()方法,只執行類B中的foo()方法。類B中使用override關鍵字定義foo()方法,表示該方法復寫了父類中的虛方法。


base.foo();

在子類中如果需要用到父類虛方法中的數據,可以在子類的覆蓋方法中通過base.方法名()調用它。

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
  
namespace ConsoleApplication5  
{  
    public interface I  
    {  
        void foo();  
    }  
    class A : I  
    {  
        //虛方法:使用virtual關鍵字定義  
        public virtual void foo()  
        {  
            Console.WriteLine("*");  
        }  
    }  
    class B : A  
    {  
        //override關鍵字作用是對父類的virtual虛方法進行重寫  
        public override void foo()  
        {  
            Console.WriteLine("#");  
            //如果父類的虛方法中有我們需要的數據,可以在子類的覆蓋方法中調用它,base.foo()。  
            base.foo();  
        }  
    }  
    public class Test  
    {  
  
        static void Main(string[] args)  
        {  
            // your code goes here  
            B b = new B();  
            b.foo();  
            Console.ReadLine();  
        }  
    }  
}  

注意:

這個方法其實就是為了重寫方法而存在的(在聲明中包含virtual關鍵字),否則沒感覺到它存在的意義。

其一:因為要重寫所以它的訪問類型如果為private則毫無意義阻礙了重寫動作的進行也就是它不能私有化,所以C#中virtual關鍵字和private關鍵字不能同時使用。

其二:因為靜態的方法和抽象方法不能重寫,同理C#中static,abstract關鍵字和virtual關鍵字不能同時使用。

其三:不能在聲明虛方法的同時指定重寫虛方法,因為重寫方法只能重寫基類的虛方法,也就是要提前在基類中聲明虛方法,所以virtual關鍵字和override關鍵字不能同時使用。

靜態方法:

使用了static 修飾符的方法為靜態方法,反之則是非靜態方法。 
靜態方法是一種 特殊的成員方法,它不屬於類的某一個具體的實例,而是屬於類本身。
所以對靜態方法不需要 首先創建一個類的實例,而是采用類名.靜態方法的格式 。
1.static方法是類中的一個成員方法,屬於整個類,即不用創建任何對象也可以直接調用!
static內部只能出現static變量和其他static方法!而且static方法中還不能使用this....等關鍵字..因為它是 屬於整個類! 
2.靜態方法效率上要比實例化高,靜態方法的缺點是不自動進行銷毀,而實例化的則可以做銷毀。 
3.靜態方法和靜態變量創建后始終使用同一塊內存,而使用實例的方式會創建多個內存. 
4.C#中的方法有兩種:實例方法,靜態方法. 類的方法代碼只有一份,它們的生命周期和類是一致的.實例方法是通過對象名調用的,靜態方法與類關聯而不是 與對象名關聯. 
5.那么在程序中什么地方可以利用靜態字段和靜態構造方法,通常適用於於一些不會經常變化而又頻繁使用的數 據,比如連接字符串,配置信息等,當滿足上面所 說的兩點時,進行一次讀取,以后就可以方便的使用了,同 時也節約了托管資源,因為對於靜態成員,一個靜態字段只標識一個存儲位置。
對一個類無論創建了多少 個實 例,它的靜態字段永遠都只有一個副本(副本我理解為只有一塊內存 靜態成員存在於內存,非靜態成員需要實例化才會分配內存,所以靜態成員不能訪問非靜態的成員..因為靜態成員 存在於內存,所以非靜態成員可以直接訪問類中靜態的成員. 
公用的處理函數,使用靜態方法應該沒有問題..牽涉 到數據共享,靜態變量的函數要多考慮...靜態變量要小心使用.. 
靜態方法 原理就是共享代碼段 共享代碼段不會產生任何問題 因為代碼段都是給CPU作為"讀取"用的,除非你進行惡意"修改"運行時的代碼段 所以靜態方法是可以放心使用的 
靜態變量 原理就是共享數據段 同上 只要沒有進行"寫入"操作就不會產生問題 但是數據通常都是用於讀和寫 所以靜態變量要注意使用 

實例方法:

早期的結構化編程,幾乎所有的方法都是“靜態方法”,而直到面向對象編程語言來臨時,才被區分為了實例化方法和靜態方法。而這樣的區分,並不是單一從性能的角度進行考慮的,而是為了讓開發更加模式化,面向對象化。

比如說人這個類,姓名、年齡等,這些屬性就必須是實例化屬性,而所屬科目,比如靈長類,則一定是靜態屬性,因為這個屬性並不依賴於某一個人

總結下來,靜態方法用在與類中屬性無關的函數,而實例化方法用在與類中屬性有關的函數。而在真實的實踐當中也證明,靜態方法的調用並不比實例化方法效率更高


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM