C#基本概念的理解

來源:互聯網
上載者:User

 

1.C#類和介面的區別
介面是負責功能的定義,項目中通過介面來規範類,操作類以及抽象類別的概念!
而類是負責功能的具體實現!
在類中也有抽象類別的定義,抽象類別與介面的區別在於:
抽象類別是一個不完全的類,類裡面有抽象的方法,屬性,也可以有具體的方法和屬性,需要進一步的專業化。
但介面是一個行為的規範,裡面的所有東西都是抽象的!
一個類只可以繼承一個基類也就是父類,但可以實現多個介面
PS:如果一個非抽象類別派生自一個介面,那麼必須實現介面中的所有成員,如果一個抽象類別派生自一個介面,除了要實現所需的所有成員外,對於要實現為抽象成員的成員,要重新聲明為抽象的(abstract)。介面除了規範一個行為之外,在具體項目中的實際作用也是十分重要的,在物件導向的設計原則以及設計模式的使用中,無不體現作為一個介面的使用好處,最直接的就是設計原則中OCP(開放封閉原則),我們使用介面,而不需要關心他的具體實現,具體實現的細節變化也無關用戶端(使用介面的類)的使用,對與擴充是開放的,我們可以另寫一個介面的實現來擴充當前程式,而不影響上層的使用,但對修改是封閉的,即我們不能夠再去修改介面的定義,當然這個“不能夠”是指在規範原則上不應該這麼做! 

2.抽象類別和介面的區別
抽象類別(abstract class)可以包含功能定義和實現,介面(interface)只能包含功能定義。
抽象類別是從一系列相關對象中抽象出來的概念, 因此反映的是事物的內部共性;介面是為了滿足外部調用而定義的一個功能約定, 因此反映的是事物的外部特性。
分析對象,提煉內部共性形成抽象類別,用以表示對象本質,即“是什麼”。
為外部提供調用或功能需要擴充時優先使用介面。

3. C#語言中,實值型別和參考型別有何不同?
  實值型別和參考型別的區別在於,實值型別的變數直接存放實際的資料,而參考型別的變數存放的則是資料的地址,即對象的引用。
  實值型別變數直接把變數的值儲存在堆棧(Stack)中,參考型別的變數把實際資料的地址儲存在堆棧中,而實際資料則儲存在堆(Heap)中。注意,堆和堆棧是兩個不同的概念,在記憶體中的儲存位置也不相同,堆一般用於儲存可變長度的資料,如字串類型;而堆棧則用於儲存固定長度的資料,如整數型別的資料int(每個int變數佔用四個位元組)。由資料存放區的位置可以得知,當把一個值變數賦給另一個值變數時,會在堆棧中儲存兩個完全相同的值;而把一個引用變數賦給另一個引用變數,則會在堆棧中儲存對同一個堆位置的兩個引用,即在堆棧中儲存的是同一個堆的地址。在進行資料操作時,對於實值型別,由於每個變數都有自己的值,因此對一個變數的操作不會影響到其它變數;對於參考型別的變數,對一個變數的資料進行操作就是對這個變數在堆中的資料進行操作,如果兩個參考型別的變數引用同一個對象,實際含義就是它們在堆棧中儲存的堆的地址相同,因此對一個變數的操作就會影響到引用同一個對象的另一個變數。

4.結構和類的區別
  1) 結構是一個實值型別,儲存在堆棧(Stack)上,而類是一個參考型別,儲存在託管堆(Heap)上。
  2) 對結構中的資料進行操作比對類或對象中的資料進行操作速度要快。
  3) 一般用結構儲存多種類型的資料,當建立一個很多類或對象共用的小型對象時,使用結構效率更高。
5.抽象方法和虛方法的區別
抽象方法
使用abstract關鍵字 public abstract bool Withdraw(…);
抽象方法是必須被衍生類別覆寫的方法。
抽象方法是可以看成是沒有實現體的虛方法。
如果類中包含抽象方法,那麼類就必須定義為抽象類別,不論是否還包含其它一般方法。

虛方法
使用virtual關鍵字 public virtual bool Withdraw(…);
調用虛方法,運行時將確定調用對象是什麼類的執行個體,並調用適當的覆寫的方法。(這句話得好好理解)
虛方法可以有實現體。
6.多態,虛方法與非虛方法的區別

多態性概述
通過繼承,一個類可以用作多種類型:可以用作它自己的類型、任何基底類型,或者在實現介面時用作任何介面類型。這稱為多態性。C# 中的每種類型都是多態的。類型可用作它們自己的類型或用作 Object 執行個體,因為任何類型都自動將 Object 當作基底類型。(很抽象吧,不用理解,看下面的更好理解)

多態性不僅對衍生類別很重要,對基類也很重要。任何情況下,使用基類實際上都可能是在使用已強制轉換為基類類型的衍生類別對象。基類的設計者可以預測到其基類中可能會在衍生類別中發生更改的方面。例如,表示汽車的基類可能包含這樣的行為:當考慮的汽車為小型貨車或敞篷汽車時,這些行為將會改變。基類可以將這些類成員標記為虛擬,從而允許表示敞篷汽車和小型貨車的衍生類別重寫該行為。

 

當衍生類別從基類繼承時,它會獲得基類的所有方法、欄位、屬性和事件。若要更改基類的資料和行為,您有兩種選擇:可以使用新的派產生員替換基成員,或者可以重寫虛擬基成員。

使用新的派產生員替換基類的成員需要使用 new 關鍵字。如果基類定義了一個方法、欄位或屬性,則 new 關鍵字用於在衍生類別中建立該方法、欄位或屬性的新定義。new 關鍵字放置在要替換的類成員的傳回型別之前。例如:

public class BaseClass
{
    public void DoWork() { }
    public int WorkField;
    public int WorkProperty
    {
        get { return 0; }
    }
}

public class DerivedClass : BaseClass
{
    public new void DoWork() { }
    public new int WorkField;
    public new int WorkProperty
    {
        get { return 0; }
    }
}

 

使用 new 關鍵字時,調用的是新的類成員而不是已被替換的基類成員。這些基類成員稱為隱藏成員。如果將衍生類別的執行個體強制轉換為基類的執行個體,就仍然可以調用隱藏類成員。例如:

DerivedClass B = new DerivedClass();
B.DoWork();  // Calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork();  // Calls the old method.

為了使衍生類別的執行個體完全接替來自基類的類成員,基類必須將該成員聲明為虛擬。這是通過在該成員的傳回型別之前添加 virtual 關鍵字來實現的。然後,衍生類別可以選擇使用 override 關鍵字而不是 new,將基類實現替換為它自己的實現。例如:

public class BaseClass
{
    public virtual void DoWork() { }
    public virtual int WorkProperty
    {
        get { return 0; }
    }
}
public class DerivedClass : BaseClass
{
    public override void DoWork() { }
    public override int WorkProperty
    {
        get { return 0; }
    }
}

欄位不能是虛擬,只有方法、屬性、事件和索引器才可以是虛擬。當衍生類別重寫某個虛擬成員時,即使該衍生類別的執行個體被當作基類的執行個體訪問,也會調用該成員。例如:

DerivedClass B = new DerivedClass();
B.DoWork();  // Calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork();  // Also calls the new method

下面給出一個更完整的例子,說明虛函數和非虛函數的區別

using System;

class A
{
     public void F(){Console.WriteLine("A.F");}
     public virtual void G(){Console.WriteLine("A.G");
}
Class B:A
{
     new public void F(){Console.WriteLine("B.F");}
     public override void G(){Console.WriteLine("B.g");}
 }
class Tese
{
    static void Main(){
    B b=new B();
    A a=b;
    a.F();
    b.F();
    a.G();
    b.G();
 }
例子中,A類提供了兩個方法:非虛的F和虛方法G.類B則提供了一個新的非虛的方法F,從而覆蓋了繼承的F;類B同時還重載了繼承的方法G.那麼輸出應該是:

A.F
B.F
B.G
B.G

注意到本例中,方法a.G()實際調用了B.G,而不是A.G.這是因為編譯時間值為A,但運行時值為B,所以B完成了對方法的實際調用.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.