亮劍.NET第二章

來源:互聯網
上載者:User

標籤:使用   ar   資料   sp   on   c   ad   new   ef   

第二章主要講解C#中各種讓人模糊不清的概念,用法,類型等等。

1.Equals()與==區別

當比較兩個實值型別時,二者基本一致,當比較參考型別時,==比較的是參考型別的地址是否一致,即兩個引用是否指向同一個堆,Equals()比較的是兩個引用指向的堆空間的內容是否一致。注意:當用一個參考型別對象A給另一個參考型別對象B賦值時,並不是複製一份堆,再把B指向堆,而是直接把A的值,即A指向的堆的地址給B,AB指向同一個堆。

2.const與readonly區別

const是編譯時間確定值,所以它只能用常量賦值。object,Array,struct不能聲明為const。

readonly是運行時確定值,可以用變數來賦值,它可以在建構函式中賦值,實現動態常量表示,更靈活。

3.private,protected,public,internal

(1)private只能類自己內部調用

(2)protected只能類自己和派生自自己的子類調用

(3)public完全開放

(4)internal只能在同一程式集內訪問,即在同一個項目內,不是同一個解決方案。

(5)protected internal只能在同一個程式集的類自己和派生自自己的子類調用

4.

sealed將類變為密封類,不能被繼承。將方法變成密封方法,不能被重載

new顯示隱藏從基類繼承的成員,不使用new也能隱藏,但是會警告。

virtual聲明虛方法,不具體實現,在子類中實現。

abstract聲明抽象類別,抽象方法,派生的子類必須實現所有抽象類別中未實現的方法。

override覆蓋virtual或者abstract修飾的方法

new和override相同點:都能對基類的方法進行隱藏,都可以用base關鍵字調用基類的成員

new和override不同點:(1)override隱藏的只能是virtual或者abstract修飾的方法,new不必要(2)當使用一個基類調用virtual方法時,如果使用override重寫了方法,那麼會調用該重寫方法,但是用new重寫的話還是會調用基類的virtual方法

5.abstract class與interface

6.公開變數與屬性的區別

如果使用公開變數,那麼可以在類的外部隨意的存取控制該成員變數,違背了物件導向中的封裝思想。

使用屬性,對屬性的訪問受限於類自身對於屬性的設定,不直接操作類的資料內容,而是通過訪問器來訪問,例如藉助於get{}set{}來讀取寫入資料,還有更多種用法,例如在更改前驗證資料等等。

屬性是對欄位(資料)的封裝。

屬性可以控制讀寫,變數不可以。

因此:當我們要把類中的一個值設為public時,儘可能使用屬性來代替變數。

7.params,out,ref

params:使得函數的參數的個數是可變的。

void f(params int[] list){..}則下列用法都可以。f(1,2);f(1,2,3);int[] ints={1,2,3};f(ints);

void f(params object[] list){..}f(1,2.23,"123");

out:一個引用傳遞

使用out修飾參數時,函數的定義和調用時都要顯式加out關鍵字,void f(out int i){....}   int i;f(out i);對於i賦不賦值都無所謂,因為在進入函數時,i會被清空。因此i不能傳入值都函數內部,只能從函數內將值帶出。它必須在函數內部被賦值,因為它本身沒有值,C#不接受一個只有地址沒有值得變數,會報錯。

ref:僅僅是一個地址

同樣在函數的定義和調用時都要顯式加ref關鍵字,使用ref修飾的參數傳遞前必須初始化,因為它傳入後值不會清空,所以必須初始化,因為它本身已經有了值,所以可以在引用它的函數內部不作改變。

8.實值型別和參考型別的區別

實值型別儲存的是資料。分配在棧中,=操作是複製本體一份。

參考型別是一種行為。分配在堆中,=操作是將堆的指標複製一份。

9.結構體與類的區別

結構體是實值型別

類是參考型別

10.string和StringBuilder的區別

string對象是不可變的,string i="a";i+="b";此時i為ab,貌似string是可以改變的,其實不然,當進行+=操作時是重新建立了一個string對象,賦值ab,原先的string被丟棄,string不能使用new string()來構造一個string對象。

StringBuilder是可變的,它專門用來處理動態變化字元類。StringBuilder str=new StringBuilder("a");str.Append("b");

相對來說,如果對字串要進行大量的動態變化,最好用StringBuilder,因為使用string會不停的建立銷毀string對象,系統開銷很大,使用StringBuilder效率更高。

 

abstract class與interface的區別還不太理解。

亮劍.NET第二章

聯繫我們

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