下文是W3Cschool為大家整理的一些比較經(jīng)典的C#面試題,大家不妨來試試,不看答案,你能答對(duì)幾題呢?
答:
private | 私有成員, 在類的內(nèi)部才可以訪問(只能從其聲明上下文中進(jìn)行訪問) |
protected | 保護(hù)成員,該類內(nèi)部和從該類派生的類中可以訪問 |
Friend | 友元 ,聲明 friend 元素的程序集中的代碼可以訪問該元素,而不能從程序集外部訪問。 |
Protected Friend | 在派生類或同一程序集內(nèi)都可以訪問。 |
public | 公共成員,完全公開,沒有訪問限制。 |
internal | 在同一程序集中可以訪問。(很少用) |
答:
答:
public class MainClass {
public static void Main(){
Console.WriteLine(Foo(30));
}
public static int Foo(int i){
if (i <= 0) return 0;
else if(i > 0 && i <= 2) return 1;
else return Foo(i - 1) + Foo(i - 2);
}
}
答:
委托是將一種方法作為參數(shù)代入到另一種方法。
是,事件是一種特殊的委托。
比如:onclick事件中的參數(shù)就是一種方法。
答:
overload 重載是方法的名稱相同,參數(shù)或參數(shù)類型不同,進(jìn)行多次重載以適應(yīng)不同的需要。
Override 是進(jìn)行基類中函數(shù)的重寫,實(shí)現(xiàn)多態(tài)。
答:
int [] array = new int [*];
int temp = 0;
for(int i = 0; i<array.Length-1; i++){
for(int j = i+1 ; j < array.Length ; j++){
if (array[j] < array[i]){
temp = array[i] ;
array[i] = array[j] ;
array[j] = temp ;
}
}
}
或者
public static void bubble_sort(int[] x){
for (int i = 0; i < x.Length; i++){
for (int j = i; j < x.Length; j++){
if (x[i] < x[j]){ //從大到小排序
int temp;
temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}
}
}
static void Main(string[] args){
int[] huage = { 1, 5, 2, 9, 3, 7, 6,4,8,0};
bubble_sort(huage);
foreach (var a in huage){
Console.WriteLine(a );
}
}
答:
C#通過提供索引器,可以象處理數(shù)組一樣處理對(duì)象。特別是屬性,每一個(gè)元素都以一個(gè)get或set方法暴露。索引器不單能索引數(shù)字(數(shù)組下標(biāo)),還能索引一些HASHMAP的字符串,所以,通常來說,C#中類的索引器通常只有一個(gè),就是THIS,但也可以有無數(shù)個(gè),只要你的參數(shù)列表不同就可以了。索引器和返回值無關(guān), 索引器最大的好處是使代碼看上去更自然,更符合實(shí)際的思考模式.
微軟官方一個(gè)示例:
索引器允許類或結(jié)構(gòu)的實(shí)例按照與數(shù)組相同的方式進(jìn)行索引。
索引器類似于屬性,不同之處在于它們的訪問器采用參數(shù)。
在下面的示例中,定義了一個(gè)泛型類(class SampleCollection<T>),并為其提供了簡單的 get 和 set 訪問器方法(作為分配和檢索值的方法)。Program 類為存儲(chǔ)字符串創(chuàng)建了此類的一個(gè)實(shí)例。
class SampleCollection<T>{
private T[] arr = new T[100];
public T this[int i]{ //注意,定義索引器。this 關(guān)鍵字用于定義索引器。
get{
return arr[i]; //訪問器采用參數(shù)
}
set{
arr[i] = value; //訪問器采用參數(shù)
}
}
}
// This class shows how client code uses the indexer
class Program{
static void Main(string[] args){
SampleCollection<string> stringCollection = new SampleCollection<string>();
stringCollection[0] = "Hello, World"; //這里 使用索引器進(jìn)行引用
System.Console.WriteLine(stringCollection[0]);
}
}
索引器使得對(duì)象可按照與數(shù)組相似的方法進(jìn)行索引。
get 訪問器返回值。set 訪問器分配值。
this 關(guān)鍵字用于定義索引器。
value 關(guān)鍵字用于定義由 set 索引器分配的值。
索引器不必根據(jù)整數(shù)值進(jìn)行索引,由您決定如何定義特定的查找機(jī)制。
索引器可被重載。
索引器可以有多個(gè)形參,例如當(dāng)訪問二維數(shù)組時(shí)。
答:
使用MVC模式分層
一般為3層:數(shù)據(jù)訪問層,業(yè)務(wù)層,表示層。
數(shù)據(jù)訪問層對(duì)數(shù)據(jù)庫進(jìn)行增刪查改。
業(yè)務(wù)層一般分為二層,業(yè)務(wù)表觀層實(shí)現(xiàn)與表示層的溝通,業(yè)務(wù)規(guī)則層實(shí)現(xiàn)用戶密碼的安全等。
表示層為了與用戶交互例如用戶添加表單。
答:
裝箱就是隱式的將一個(gè)值型轉(zhuǎn)換為引用型對(duì)象。
拆箱就是將一個(gè)引用型對(duì)象轉(zhuǎn)換成任意值型。
比如:
int i=0;
System.Object obj=i;
這個(gè)過程就是裝箱!就是將 i 裝箱!
比如:
int i=0;
System.Object obj=i;
int j=(int)obj;
這個(gè)過程前2句是將 i 裝箱,后一句是將 obj 拆箱!
答:
托管代碼是運(yùn)行.NET 公共語言運(yùn)行時(shí)CLR的代碼。
unsafe:非托管代碼,不經(jīng)過CLR運(yùn)行,程序員自行分配和釋放內(nèi)存空間。
答:
DataSet:數(shù)據(jù)集。
DataCommand:執(zhí)行語句命令。
DataAdapter:數(shù)據(jù)的集合,用于填充。
DataReader:數(shù)據(jù)只讀器
Connection:數(shù)據(jù)庫連接對(duì)像
Command:數(shù)據(jù)庫命令
答:代碼后置。
答:程序集。(中間語言,源數(shù)據(jù),資源,裝配清單)
答:
1.使用WSDL.exe命令行工具。
2.使用VS.NET中的Add Web Reference菜單選項(xiàng)
答:
?string str = null
?是不給他分配內(nèi)存空間,而?string str = ""
? 給它分配長度為空字符串的內(nèi)存空間。
答:
class可以被實(shí)例化,屬于引用類型,class可以實(shí)現(xiàn)接口和單繼承其他類,還可以作為基類型,是分配在內(nèi)存的堆上的。
struct屬于值類型,不能作為基類型,但是可以實(shí)現(xiàn)接口,是分配在內(nèi)存的棧上的。
答:
解1:
select top 10 * from A where id not in (select top 30 id from A)
解2:
select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)
答:
GC是垃圾收集器。程序員不用擔(dān)心內(nèi)存管理,因?yàn)槔占鲿?huì)自動(dòng)進(jìn)行管理。要請(qǐng)求垃圾收集,可以調(diào)用下面的方法之一:
?System.gc()
?或者?Runtime.getRuntime().gc()
?
答:
兩個(gè)對(duì)象,一個(gè)是“xyz”,一個(gè)是指向“xyz”的引用對(duì)象s。
答:
會(huì)執(zhí)行,在return后執(zhí)行。
答:
Set里的元素是不能重復(fù)的,那么用?iterator()
?方法來區(qū)分重復(fù)與否。?equals()
?是判讀兩個(gè)Set是否相等。
?equals()
?和==方法決定引用值是否指向同一對(duì)象?equals()
?在類中被覆蓋,為的是當(dāng)兩個(gè)分離的對(duì)象的內(nèi)容和類型相配的話,返回真值。
答:
final:修飾符(關(guān)鍵字),如果一個(gè)類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個(gè)類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載
finally:在異常處理時(shí)提供 finally 塊來執(zhí)行任何清除操作。如果拋出一個(gè)異常,那么相匹配的 catch 子句就會(huì)執(zhí)行,然后控制就會(huì)進(jìn)入 finally 塊(如果有的話)。
finalize:方法名。Java 技術(shù)允許使用 ?finalize()
? 方法在垃圾收集器將對(duì)象從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對(duì)象沒有被引用時(shí)對(duì)這個(gè)對(duì)象調(diào)用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 ?finalize()
? 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。?finalize()
?方法是在垃圾收集器刪除對(duì)象之前對(duì)這個(gè)對(duì)象調(diào)用的。
答:
用存儲(chǔ)過程或事務(wù)。取得最大標(biāo)識(shí)的時(shí)候同時(shí)更新..注意主鍵不是自增量方式這種方法并發(fā)的時(shí)候是不會(huì)有重復(fù)主鍵的..取得最大標(biāo)識(shí)要有一個(gè)存儲(chǔ)過程來獲取.
答:
進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的單位;線程是CPU調(diào)度和分派的單位,一個(gè)進(jìn)程可以有多個(gè)線程,這些線程共享這個(gè)進(jìn)程的資源。
答:
棧:由編譯器自動(dòng)分配、釋放。在函數(shù)體中定義的變量通常在棧上。
堆:一般由程序員分配釋放。用new、malloc等分配內(nèi)存函數(shù)分配得到的就是在堆上。
答:
它們被稱為常成員變量和常成員函數(shù),又稱為類成員變量和類成員函數(shù)。分別用來反映類的狀態(tài)。比如類成員變量可以用來統(tǒng)計(jì)類實(shí)例的數(shù)量,類成員函數(shù)負(fù)責(zé)這種統(tǒng)計(jì)的動(dòng)作。
答:
全局程序集緩存。
答
DataReader和DataSet最大的區(qū)別在于:DataReader使用時(shí)始終占用SqlConnection在線操作數(shù)據(jù)庫。
任何對(duì)SqlConnection的操作都會(huì)引發(fā)DataReader的異常。因?yàn)?b>DataReader每次只在內(nèi)存中加載一條數(shù)據(jù),所以占用的內(nèi)存是很小的。
因?yàn)?b>DataReader的特殊性和高性能,所以DataReader是只進(jìn)的,你讀了第一條后就不能再去讀取第一條了。
DataSet則是將數(shù)據(jù)一次性加載在內(nèi)存中,拋棄數(shù)據(jù)庫連接,讀取完畢即放棄數(shù)據(jù)庫連接。
因?yàn)?b>DataSet將數(shù)據(jù)全部加載在內(nèi)存中,所以比較消耗內(nèi)存。但是確比DataReader要靈活,可以動(dòng)態(tài)的添加行、列、數(shù)據(jù)、對(duì)數(shù)據(jù)庫進(jìn)行回傳更新操作。
答:
using:引入名稱空間或者使用非托管資源,使用完對(duì)象后自動(dòng)執(zhí)行實(shí)現(xiàn)了IDisposable接口的類的Dispose方法
new:新建實(shí)例或者隱藏父類方法
答:
虛函數(shù):沒有實(shí)現(xiàn)的,可由子類繼承并重寫的函數(shù)。?Virtual CallSomeOne();
?
抽象函數(shù):規(guī)定其非虛子類必須實(shí)現(xiàn)的函數(shù),必須被重寫。?public abstract void CallSomeOne();
?
答:
在C#中有兩個(gè)屬性,分別為Property和Attribute。
Property比較簡單,就是我們常用的get和set,主要用于為類中的private和protected變量提供讀取和設(shè)置的接口。
Attribute用來說明這個(gè)事物的各種特征的一種描述。而Attribute就是干這事的。它允許你將信息與你定義的C#類型相關(guān)聯(lián),作為類型的標(biāo)注。
這些信息是任意的,就是說,它不是由語言本身決定的,你可以隨意建立和關(guān)聯(lián)任何類型的任何信息。你可以作用屬性定義設(shè)計(jì)時(shí)信息和運(yùn)行時(shí)信息,甚至是運(yùn)行時(shí)的行為特征。關(guān)鍵在于這些信息不僅可以被用戶取出來作為一種類型的標(biāo)注,它更可以被編譯器所識(shí)別,作為編譯時(shí)的一種附屬條件參加程序的編譯。
定義屬性:屬性實(shí)際上是一個(gè)派生自System.Attribute基類的類。System.Attribute類含有幾個(gè)用于訪問和檢查自定義屬性的方法。盡管你有權(quán)將任何類定義為屬性,但是按照慣例來說,從System.Attribute派生類是有意義的
答:
HashMap是Hashtable的輕量級(jí)實(shí)現(xiàn)(非線程安全的實(shí)現(xiàn)),他們都完成了Map接口,主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線程安全,效率上可能高于Hashtable。
答:
.NET一般指 .NET FrameWork框架,它是一種平臺(tái),一種技術(shù)。
C#是一種編程語言,可以基于.NET平臺(tái)的應(yīng)用。
答:
啟動(dòng)一個(gè)線程是調(diào)用?start()
?方法,使線程所代表的虛擬處理機(jī)處于可運(yùn)行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行。這并不意味著線程就會(huì)立即運(yùn)行。
?run()
?方法可以產(chǎn)生必須退出的標(biāo)志來停止一個(gè)線程。
答:
數(shù)組沒有?length()
?這個(gè)方法,有length的屬性。String有length()
?這個(gè)方法。
答:
基于值類型的變量直接包含值。將一個(gè)值類型變量賦給另一個(gè)值類型變量時(shí),將復(fù)制包含的值。這與引用類型變量的賦值不同,引用類型變量的賦值只復(fù)制對(duì)對(duì)象的引用,而不復(fù)制對(duì)象本身。所有的值類型均隱式派生自 System.ValueType。與引用類型不同,從值類型不可能派生出新的類型。但與引用類型相同的是,結(jié)構(gòu)也可以實(shí)現(xiàn)接口。與引用類型不同,值類型不可能包含 null值。然而,可空類型功能允許將 null 賦給值類型。每種值類型均有一個(gè)隱式的默認(rèn)構(gòu)造函數(shù)來初始化該類型的默認(rèn)值。
值類型主要由兩類組成:結(jié)構(gòu)、枚舉,結(jié)構(gòu)分為以下幾類:Numeric(數(shù)值)類型、int型(整型)、float型(浮點(diǎn)型)、decimal、?bool?(布爾型)、用戶定義的結(jié)構(gòu)。引用類型的變量又稱為對(duì)象,可存儲(chǔ)對(duì)實(shí)際數(shù)據(jù)的引用。聲明引用類型的關(guān)鍵字:class、interface、delegate、內(nèi)置引用類型:object、string
答:
異:不能直接實(shí)例化接口。接口不包含方法的實(shí)現(xiàn)。接口、類和結(jié)構(gòu)可從多個(gè)接口繼承。但是C# 只支持單繼承:類只能從一個(gè)基類繼承實(shí)現(xiàn)。類定義可在不同的源文件之間進(jìn)行拆分。
同:接口、類和結(jié)構(gòu)可從多個(gè)接口繼承。接口類似于抽象基類:繼承接口的任何非抽象類型都必須實(shí)現(xiàn)接口的所有成員。接口可以包含事件、索引器、方法和屬性。一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。
更多建議: