對C#的認識(1)

來源:互聯網
上載者:User

.Net 2.0相對於.Net 1.1增加了局部類,泛型和匿名委託。

匿名委託

struct和class的區別

1. struct是實值型別,class是參考型別,實值型別在Stack上分配,參考型別在Heap上分配。

2. struct無法繼承,class可以繼承。

3. struct無預設構造器,但可添加構造器,無解構函式,無法用abstract, sealed, protected關鍵字(因為無法繼承),可以不使用new初始化。

    class有預設構造器,有解構函式,可以用abstract, sealed, protected關鍵字,必須用new初始化。

protected和internal的區別

protected只有在繼承的子類中可以訪問,但可以跨程式集(assembly)

internal只有在同一個程式集內可以訪問,但可以跨類。

預設存取權限

對於類的成員,預設存取權限是private。

對於類型(類、介面、結構等),預設存取權限是internal。

對於介面的屬性及方法,預設存取權限是public。

委託和事件

委託是多路廣播的,即一個委託可以指向多個方法,它維護著一個方法列表,在該委託被調用時,這些方法都會被調用。

委託指向靜態方法時,最好在靜態方法前面加上類名(有時是必須的),在指向執行個體方法時,最好也加上this關鍵字。

事件模型是基於發行者和訂閱者模式(publisher and subscribers),任何對象都能發布一組其他對象可以訂閱的事件,當發布對象觸發該事件時,所有訂閱者都會被通知到。事件可以看作是發布它的對象的屬性,關鍵字event用於定義一個事件,而該事件是委託的一個特殊執行個體,它也是一個委派物件。事件可以說是一個具有特殊標識的委派物件。具有事件標識的委派物件有一些限制,例如它只能使用+=和-=來載入或者卸載事件處理方法,它無法使用"=new MyDelegate(M1);"這樣的方式來指向某個方法,也無法通過"myobject.myevent();"的方式來調用它。不過對於發布該事件的對象來說,可以通過"this.myevent();"來調用。

.Net內建的事件處理器是一個委託,一個針對事件處理的委託,它只有兩個參數,並且沒有傳回值,一個參數是事件來源,即觸發該事件的對象,另一個參數是EventArgs類的對象或者是繼承了EventArgs類的類的對象,用於儲存一些事件參數,這些參數可以傳遞給事件處理器方法來進行處理。對於有自訂參數需要傳送的情況,我們可以首先實現一個繼承了EventArgs類的類,然後在事件處理器方法裡使用該類的對象作為第二個參數。

介面和抽象類別的區別

1. 抽象類別可以包含實現細節和欄位成員,介面不能,不過介面可以包含屬性聲明。

2. 類只能繼承一個抽象類別,但類可以實現多個介面。

3. 抽象類別可以有非公用方法和屬性,但介面不能(都是公用的),而且介面中的方法和屬性不能使用存取權限修飾符,例如public等。

4. 抽象類別可以有靜態方法和變數,以及常量,但介面不能。

5. 抽象類別有構造器,但介面沒有。

6. 介面及其中的方法和屬性不能用static, abstract, sealed和virtual關鍵字修飾。

介面屬性的定義

interface I1

{

      int InterfaceProperty{get;set;}

}

對於面向介面的編程,一般分三層:

1. 介面(定義方法規範)

2. 抽象類別(實現介面,一般實現多個介面;定義資料成員及靜態方法和變數,以及常量;如有需要,實現部分功能)

3. 具體類(繼承抽象類別,根據需求實現全部功能)

泛型介面和泛型類

對於泛型介面,它可以繼承一般的介面,但如果是一般的介面繼承或者是類實現它時,必須提供一個具體的類型,包括裡面的方法參數和傳回值以及資料成員,必須提供一個具體的類型。而如果是泛型介面繼承或者是泛型類實現它時,則沒有這個限制。

class MyClass<U, T> : I1<U>, I2<T>
{
        I1<T> i;
        public void MyMethod(I1<T> p)
        {
        }
}

可以通過編譯。

不過,

class MyClass<U, T> : I1<U>, I2<T>
{
        public void InterfaceMethod(I1<T> p)
        {
        }
}

無法通過編譯。因為InterfaceMethod的參數類型必須是I1<U>(註:InterfaceMethod是介面I1<U>定義的一個方法)。

class MyClass<U, T> : I1<U>, I1<T>
{
        I1<T> i;
        public void MyMethod(I1<T> p)
        {
        }
}

無法通過編譯。這是由於違反了介面實現的獨特性,實現了兩次相同的泛型介面。

不過,

class MyClass : I1<int>, I1<long>
{
        I1<int> i;
        public void MyMethod(I1<int> p)
        {
        }
}

可以通過編譯,因為I1<int>和I1<long>是兩個不同的介面。

當類實現多個介面時,需要對不同介面的方法一一實現,不過如果兩個介面中的方法頭一模一樣,則只需實現一次該方法即可,如果想對兩個介面的該方法都實現,那麼其中至少有一個方法必須顯示實現,如"void I1.Method1()",並且該方法無法使用存取權限修飾符,即為private的存取權限(預設許可權),另一個如果沒有顯示實現,則可以設定許可權。對於已提供具體類型的泛型介面實現,如"class MyClass : I1<int>, I1<long>",也需要顯示實現其中一個,當然顯示實現兩個也是可以的。

as操作符

as操作符用於安全地進行顯示轉換。使用as操作符進行顯示轉換時,如果轉換失敗,將賦予變數null值,而不是拋出異常,然後可以通過判斷變數是否為null來確定轉換是否成功,從而可以不使用try---catch來捕獲異常。

String和string的區別

String是.Net Framework中的類而string是C#中的關鍵字,string映射為String,就是編譯的時候編譯器會把它變成String,直接寫String可以讓編譯器少做一點點工作。

Array和ArrayList的區別

Array是個抽象類別,ArrayList是個具體類,Array其實就是數組,ArrayList是個集合。

部分類的好處

1、對於代碼太多的類,使用部分類可以使條理更加清晰,同時便於多個程式員同時修改一個類。

2、對於WinForm和WebForm可以使控制項定義及處理邏輯分開,便於維護管理。

使用部分類的注意點

1、所有該類的部分類必須使用partial關鍵字,並且位於相同的命名空間下。

2、每個定義的partial類必須在存取修飾詞上保持一致,如果有一個部分是抽象的或者密封的或者繼承自某個類,則整個類都是這樣的,各個部分之間不能矛盾,所有部分只能繼承自同一個類。

3、該類實現的介面為所有部分類實現的介面的總和,即具有累加效應,又比如對於屬性也是一樣。

4、在某一部分類定義的欄位和對象可在其他部分類中使用。

5、所有部分類必須同時被編譯。

6、只適用於class,struct,interface。

相關文章

聯繫我們

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