1.靜態變量和非靜態變量的區別
靜態變量:靜態變量使用 static 修飾符進行聲明 ,在所屬類被裝載時創建,通過類進行訪問,所屬類的 所有實例的同一靜態變量都是同一個值。 非靜態變量:不帶有static 修飾符聲明的變量稱做非靜態變量,在類被實例化時創建,通過對象進行訪 問,同一個類的不同實例的同一非靜態變量可以是不同的值。
2.const和static readonly的區別
const:用const 修飾符聲明的成員叫常量,是在編譯期初始化並嵌入到客戶端程序。 static readonly:用static readonly 修飾符聲明的成員依然是變量,只不過具有和常量類似的 使用方法:通過類進行訪問、初始化後不可以修改。但與常量不同的是這種變量是在運行期初始化。
3.extern是什麽意思
extern:修飾符用于聲明由程序集外部實現的成員函數,經常用于系統API函數的調用。 注意:和DllImport一起使用時要加上static修飾符,也可以用于對于同一程序集不同版本組件的 調用(用extern聲明別名),不能與abstract修飾符同時使用。
4.abstract是什麽意思
abstract修飾符可以用于類、方法、屬性、事件和索引指示器(indexer),表示其爲抽象成員。 abstract不可以和 static 、virtual 、override 一起使用。 聲明爲abstract成員可以不包括實現代碼,但只有類中還有未實現的抽象成員,該類就不可以被實例化, 通常用于強制繼承類必須實現某一成員。
5.internal是什麽意思
internal 修飾符可以用于類型或成員,使用該修飾符聲明的類型或成員只能在同一程集內訪問, 接口的成員不能使用 internal 修飾符
6.sealed修飾符是幹什麽的?
sealed修飾符表示密封,用于類時,表示該類不能再被繼承,不能和abstract同時使用, 因爲這兩個修飾符在含義上互相排斥,用于方法和屬性時,表示該方法或屬性不能再被繼承, 必須和override關鍵字一起使用,因爲使用sealed修飾符的方法或屬性肯定是基類中相應的虛成員, 通常用于實現第三方類庫時不想被客戶端繼承,或用于沒有必要再繼承的類以防止濫用繼承造成 層次結構體系混亂。恰當的利用sealed修飾符也可以提高一定的運行效率。
7.override和overload有什麽區別
override 表示重寫,用于繼承類對基類中虛成員的實現。 overload 表示重載,用于同一個類中同名方法不同參數(包括類型不同或個數不同)的實現。
8.什麽是指引器?
實現索引指示器(indexer)的類可以象數組那樣使用其實例後的對象,但與數組不同的是索引指示器的 參數類型不僅限于int,簡單來說,其本質就是一個含參數屬性。
9.new修飾符是起什麽作用的?
new 修飾符與 new 操作符是兩個概念。 new 修飾符用于聲明類或類的成員,表示隱藏了基類中同名的成員。而new 操作符用于實例化一個類型。 new 修飾符只能用于繼承類,一般用于彌補基類設計的不足。 new 修飾符和override修飾符不可同時用在一個成員上,因爲這兩個修飾符在含義上互相排斥。
10.this關鍵字的含義
this是一個保留字,僅限于構造函數和方法成員中使用。 在類的構造函數中出現表示對正在構造的對象本身的引用, 在類的方法中出現表示對調用該方法的對象的引用。 在結構的構造上函數中出現表示對正在構造的結構的引用, 在結構的方法中出現表示對調用該方法的結果的引用。 this保留字不能用于靜態成員的實現裏,因爲這時對象或結構並未實例化。 在C#系統中,this 實際上是一個常量,所以不能使用this++這樣的運算。 this保留字一般用于限定同名的隱藏成員、將對象本身做爲參數、聲明索引訪問器、判斷傳入參數的對象是否爲本身。
11.可以使用抽象函數重寫基類中的虛函數嗎?
可以,但需使用new修飾符顯式聲明,表示隱藏了基類中該函數的實現。
12.密封類可以有虛函數嗎?
可以,基類中的虛函數將隱式的轉化爲非虛函數,但密封類本身不能再增加新的虛函數。
13.什麽是屬性訪問器?
如果基類中的虛屬性只有一個屬性訪問器,那麽繼承類重寫該屬性後可以有幾個屬性訪問器?如果基類中有get和set兩個呢? 如果基類中的虛屬性只有一個屬性訪問器,那麽繼承類重寫該屬性後也應只有一個。 如果基類中有get和set兩個屬性訪問器,那麽繼承類中可以只有一個也可以同時有兩個屬性訪問器。
14.abstract,virtual,override。
abstract 可以和 virtual 一起使用嗎?可以和 override 一起使用嗎? abstract 修飾符不可以和 static、virtual 和 override 修飾符一起使用。
15.接口可以包含哪些成員?
接口可以包含屬性、方法、索引指示器和事件,但不能包含常量、域、操作符、構造函數和析構函數,而且也不能包含任何靜態成員。
16.類和結構的區別
類:類是引用類型在堆上分配,類的實例進行賦值只是複制了引用,都指向同一段實際對象分配的內存, 類有構造和析構函數,類可以繼承和被繼承。 結構:結構是值類型在棧上分配(雖然棧的訪問速度比較堆要快,但棧的資源有限放), 結構的賦值將分配産生一個新的對象。結構沒有構造函數,但可以添加。結構沒有析構函數, 結構不可以繼承自另一個結構或被繼承,但和類一樣可以繼承自接口。
C# 中的接口與類不同,可以使用多繼承,即一個子接口可以有多個父接口。 但如果兩個父成員具有同名的成員,就産生了二義性(這也正是C#中類取消了多繼承的原因之一),這時在實現時最好使用顯式的聲明。
抽象類(abstract class)可以包含功能定義和實現, 接口(interface)只能包含功能定義,抽象類是從一系列相關對象中抽象出來的概念,因此反映的是事物的 內部共性,接口是爲了滿足外部調用而定義的一個功能約定, 因此反映的是事物的外部特性,分析對象, 提煉內部共性形成抽象類,用以表示對象本質,即“是什麽”,爲外部提供調用或功能需要擴充時優先使用接口。
通過別名指示符我們可以爲某個類型起一個別名,主要用于解決兩個命名空間內有同名類型的沖突或 避免使用冗余的命名空間,別名指示符只在一個單元文件內起作用。
文章轉自CSDN 博主 彖爻之辭