最新C#基礎知識,面試題彙總
工作來之不易,珍惜!珍惜!珍惜!
--非技術問題
1、對你來說工作中最重要的是什麼?
答:團隊目標的實現。(這是所有公司希望員工擁有的素質)
2、為什麼願意為本公司工作?
答:因為我認為我可以與貴公司取得共同的發展。(暗示留下我可能為公司帶來的益處)
3、你認為公司為什麼要聘用你?
答:因為我認為我的能力和性格完全適合貴公司的這個職位。
4、如果我們聘用你,你會待多久?
答:我說過了,我想與貴公司共同發展,當然我相信這種發展是可持續的,我不願意失去這個發展機會。(考慮忠誠度問題,這樣回答比較中肯,亂髮誓在陌生人面前是完全沒用的)
5、在你看來,我們會為你的職業生涯規劃一個怎樣的環境?
答:我有一個比較長遠的職業生涯規劃目標,但不管是近期目標還是中長期目標,貴公司的環境恰恰與我的計劃相吻合,我相信一定能在貴公司的幫助下實現自己的規劃。(看你的計劃性,如果知道公司的一些具體情況,也可順便拍拍馬屁,但不能過頭)
6、你的優點是什麼?
答:優點是不喜歡多說,喜歡多做。(每個老闆都喜歡的腳踏實地而不是誇誇其談的員工)
7、什麼是你最大的弱點?友情提示:不妨借自我批評來自我表揚。
答1:我的短處是心比較軟,總是不擅於推辭別人的要求。(體現你的樂於助人)
答2:我過去不太注重與人的溝通,覺得只要技術好就可以了,但隨著年齡的增長和接觸更多的人,我覺得與人溝通也很重要,我現在正努力地鍛鍊提高自己的溝通能力
8、你的業餘時間(愛好)喜歡做什麼?
答:我經常會去打籃球,喜歡戶外運動,聽音樂和看電影
9、你對薪水的期望是多少?
答:望可以根據貴公司的情況以及本地軟體業行情還有我的能力給出一個合理的薪金。(說的多和少都不合適啊!留給公司去決定吧。。。)
10、如果……的話,你怎麼辦?
答:如果在我的利益呵公司的利益之間選擇,我會毫不猶豫選擇公司。
11、你對我們公司有什麼想法?
友情提示:這可體現你對公司前景的關注,切忌回答:“都很好,沒什麼想法。”,參考回答:“貴公司XX地方做的很好,但XX地方需要加強”, 不宜多說。
------------------------------------------------------------------------------------技術性問題3. const和readonly有什麼區別?
答:const可以用於類的成員常量和區域性常量,必須在宣告時賦值,之後不可以對常量進行賦值。而readonly只能用於類的成員變數不能用於區域性變數,在宣告時可以不賦值,除了在建構函式中可以再次賦值外,其它的地方和const一樣也不能賦值。
5. 介面和抽象類有什麼區別?你選擇使用介面和抽象類的依據是什麼?答
答:區別如下
(1) 抽象類可以有抽象成員(無具體實現),也可以有非抽象成員(有具體實現);介面只有抽象成員。
(2) 一個類不能同時繼承多個抽象類,一個類可以同時實現多個介面。
如果多個子類中有很多程式碼是重複的,這時採用抽象類,因為可以將這些程式碼放到抽象類的非抽象方法中,這樣可以達到程式碼複用。當實現多個介面時因為抽象類不支援,只能使用介面。
6. struct和class有什麼區別
答:兩者都可以有成員變數、屬性、索引器、事件、函式、建構函式,主要區別如下:
區別點 結構 類
型別 值型別 引用型別
成員變數 在宣告時不能賦值 可以賦值也可以不賦值
建構函式 可以不寫,系統提供預設建構函式,預設建構函式中會將所有成員值設為0,如果寫了建構函式則建構函式必須有引數,且在建構函式中必須為每一個成員賦值。 可以不寫,系統提供預設建構函式,寫了也沒有結構中的限制。
解構函式 不能有解構函式 可以有解構函式
繼承性 自定義的結構不能從類繼承,但可以實現介面,結構都是密封(sealed),不能從結構繼承 類沒有限制
7. try後面一個finally,try中有一個return,那麼finally中的程式碼會不會執行?如果執行,是在return後還是return前。
答:會執行,並且在return 後執行。
8. 產生一個int陣列,長度為100,並向其中隨機插入1-100,並且不能重複。
答:該題解題思路有很多,主要是看執行效率如何,下面提供一種方法。
int[] array = new int[100];
int temp[] = new int[100];
for (int i = 0; i < 100; i++)
{
temp[i]=i+1;
}
Random rand = new Random();
for (int i = 0; i < 100; i++)
{
int index = rand.Next(100-i-1);
array[i] = temp[index];
temp[index]=temp[100-i-1];
}
9. C#中要使一個類支援foreach遍歷,實現過程怎樣?
答:必須實現IEnumerable,IEnumerator這兩個介面,如下:
public class MyList : IEnumerable,IEnumerator
{
private int position = -1;
string[] array = new string[4];
public MyList()
{
array[0] = "a";
array[1] = "b";
array[2] = "c";
array[3] = "d";
}
#region IEnumerable 成員
//每次使用foreach時都會呼叫它得到一個列舉器
public IEnumerator GetEnumerator()
{
Reset();
return (this as IEnumerator);
}
#endregion
#region IEnumerator 成員
//遍歷時通過這個屬性得到值
public object Current
{
get { return array[position]; }
}
//訪問下一個元素時使用MoveNext移動位置
public bool MoveNext()
{
if (position < array.Length-1)
{
position++;
return true;
}
else
return false;
}
//遍歷前要使位置歸位
public void Reset()
{
position = -1;
}
#endregion
}
以下不用foreach遍歷集合
MyList list=new MyList();
While(list.MoveNext())
{
Object o=list.Current;
}
10. 以下程式有什麼錯?
public class TestClass
{
private int count;
private static int y;
public static void setvalue ()
{
count=1;
y=1;
}
}
答:在靜態函式中只能訪問靜態成員變數;以上程式碼訪問了例項成員。
11. net中什麼類不能被繼承?
答:如果在類前加上sealed關鍵字,則表示該類為密封類,密封類不能被繼承。
sealed 除了可以應用於類外,還可以應用於例項方法和屬性。密封方法會重寫基類中的方法,但其本身不能在任何派生類中進一步重寫。當應用於方法或屬性時,sealed 修飾符必須始終與override一起使用。如:
//下面這個sealed使用正確,表示該類不能繼承
public sealed class Test
{
private int myVar;
//下面這個sealed錯誤,編譯不會通過,因為sealed必須和override一起使用
public sealed int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
//下面這個sealed使用正確,表示如果該類不是密封類,
//那麼在派生類中也不可以重寫該方法
public sealed override string ToString()
{
return base.ToString();
}
}
12. is 和as 有什麼區別?
答:is用來判斷一個例項是否屬於某個類。如:
Dog d=new Dog();
If(d is Dog)
{
Console.WriteLine(“d是一隻狗”);
}
以上語句Console.WriteLine(“d是一隻狗”);會執行,因為d is Dog返回true,如果Dog從Animal類繼承並實現了IPet介面,則d is Animal和d is IPet都會返回true;
as用於在相容的引用型別之間執行轉換,如果轉換失敗則返回null,它等價於如下語句:
expression is type ? (type)expression : (type)null
13. net中函式傳遞引數有那些方式?有什麼區別?
答:傳值和傳引用,傳引用又兩種方式,ref和out,ref要求變數在傳參前賦值,out可以不賦值。傳引用必須是一個地址,傳值是指將棧中的值拷貝到函式的引數,傳引用表示傳入的變數和接收引數是同一個變數
public class Test
{
public int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
}
以上這個類中有欄位和屬性
private void F(ref int i)
{
i = 100;
}
有一個方法傳遞引用,呼叫方式如下:
Test t = new Test();
F(ref t. MyProperty);
以上程式碼編譯不能通過,因為屬性不是變數,其實質是函式,如下則可通過
Test t = new Test();
F(ref t. myVar);
因為欄位是變數
14. 一列數的規則如下: 1、1、2、3、5、8、13、21、34...... 求第30位數是多少, 用遞迴演算法實現。
答: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 <= 2)
return 1;
else
return Foo(i -1) + Foo(i - 2);
}
}
15. C#中的委託是什麼?事件是不是一種委託?
答 :委託封裝了函式指標的集合,它可以指向一組函式。
事件也是委託,是一種特殊的委託。
16. 請程式設計實現一個氣泡排序演算法?
答:
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 ;
}
}
}
17. 在下面的例子裡
using System;
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B()
{
y=-1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}",x,y);
}
}
當使用new B()建立B的例項時,產生什麼輸出?
答:X=1,Y=0
當使用New建立B的例項時,因為B繼承了A類,A的建構函式首先會被執行,但應當注意的是,雖然執行的是A的建構函式,但在A的建構函式中呼叫的函式首先是在B類中查詢,因為PrintFields已被重寫,所以最終執行B類中的PrintFields函式。
18. CTS、CLS、CLR分別作何解釋?
答:
CTS:Common Type System 通用系統型別。
CLS:Common Language Specification 通用語言規範。
CLR:Common Language Runtime 公共語言執行庫。
20. net Remoting 的工作原理是什麼?
答:伺服器端向客戶端傳送一個程序編號,一個程式域編號,以確定物件的位置。
21. 求以下表達式的值,寫出您想到的一種或幾種實現方法: 1-2+3-4+……+m
答:
int m = Convert.ToInt32(this.TextBox1.Text) ;
int sum = 0 ;
for (int i = 0 ; i < m + 1 ; i++)
{
if((i%2) == 1)
{
sum += i ;
}
Else
{
sum = Sum - I ;
}
}
System.Console.WriteLine(sum.ToString());
System.Console.ReadLine() ;
其實還有一個很簡單的方式,上面的表示式,把它分成1-2、3-4、5-6……可以看出,如果m是偶數,那麼結果就是m/2*(-1),如果m是奇數,結果就是m-m/2
22. 列舉ASP.NET 頁面之間傳遞值的幾種方式。
答. 1).使用QueryString, 如....?id=1; response. Redirect()....
2).使用Session變數
3).使用Server.Transfer
4).Application
5).<input type="hidden"></input>
6).資料庫
7).ViewStat
8).cookie
23. 請程式設計遍歷頁面上所有TextBox控制元件並給它賦值為string.Empty?
答:在頁面中呼叫下面的函式,SetTextBox(this);
public void SetTextBox(Control ctrl)
{
if (ctrl is TextBox)
{
(ctrl as TextBox).Text=string.Empty;
}
else
{
foreach (Control child in ctrl.Controls)
{
SetTextBox(ctrl);
}
}
}
24. 根據執行緒安全的相關知識,分析以下程式碼,當呼叫test方法時i>10時是否會引起死鎖?並簡要說明理由。
Class A
{
public void Test(int i)
{
lock(this)
{
if (i>10)
{
i--;
Test(i);
}
}
}
}
答:不會發生死鎖,(但有一點int是按值傳遞的,所以每次改變的都只是一個副本,因此不會出現死鎖。但如果把int換做一個object,那麼死鎖會發生)
25. 簡要談一下您對微軟.NET 構架下remoting和webservice兩項技術的理解以及實際中的應用。
答:WebSevice使用HTTP協議,因此可以穿透防火牆。而Remoting使用TCP/IP,二進位制傳送提高效率。
remoting是.net中用來跨越machine, process, appdomain進行方法呼叫的技術,對於三層結構的程式,就可以使用remoting技術來構建.它是分佈應用的基礎技術.相當於以前的DCOM;Web Service是一種構建應用程式的普通模型,並能在所有支援internet網通訊的作業系統上實施。Web Service令基於元件的開發和web的結合達到最佳,基於元件的物件模型
26. 公司要求開發一個繼承System.Windows.Forms.ListView類的元件,要求達到以下的特殊功能:點選ListView各列列頭時,能按照點選列的每行值進行重排檢視中的所有行 (排序的方式如DataGrid相似)。根據您的知識,請簡要談一下您的思路
答:根據點選的列頭,包該列的ID取出,按照該ID排序後,在繫結到ListView中。
28. String s = new String("xyz");建立了幾個String Object?
答:兩個物件,一個是“xyx”字串常量,一個是值為“xyx”的引用對像s。
29. String s=””;和string s=string.Empty;有什麼區別,哪一種方式更好?
String s=””;先分配一塊記憶體存放””文字常量,s引用該記憶體,string s=string.Empty;s引用string類中的靜態變數地址(靜態變數開始會被初始化,所以無論引用多少次,只會分配一次記憶體),兩者比較,後者少了一次記憶體分配,所以效率更高。
30. 建構函式是否可被override?
答:不能。
31. 是否可以繼承String類?
答:string 是密封類,所以不能被繼承。
32. Session有什麼重大BUG,微軟提出了什麼方法加以解決?
答:是iis中由於有程序回收機制,系統繁忙的話Session會丟失,可以用Sate server或SQL Server資料庫的方式儲存Session不過這種方式比較慢,而且無法捕獲Session的END事件。
33. 程序和執行緒的區別?
答:程序是系統進行資源分配和排程的單位;執行緒是CPU排程和分派的單位,一個程序可以有多個執行緒,這些執行緒共享這個程序的資源。
34. 堆和棧的區別?
答:棧是編譯期間就分配好的記憶體空間,因此你的程式碼中必須就棧的大小有明確的定義;堆是程式執行期間動態分配的記憶體空間,你可以根據程式的執行情況確定要分配的堆記憶體的大小
35. 成員變數和成員函式前加static的作用?
答:它們被稱為常成員變數和常成員函式,又稱為類成員變數和類成員函式。分別用來反映類的狀態。比如類成員變數可以用來統計類例項的數量,類成員函式負責這種統計的動作。
ASP。NET與ASP相比,主要有哪些進步?
答:asp解釋型,aspx編譯型,效能提高,可以跟美工的工作分開進行,更有利於團隊開發。
36. 在c#中using和new這兩個關鍵字有什麼意義,請寫出你所知道的意義?
using:
A. 引入名稱空間
B. 放入實現了IDisposable介面的物件,在作用域過後會自動呼叫該物件的Dispose方法。
new :
A. 新建例項
B. 覆蓋父類方法
C. 對泛型型別進行約束,規定該型別必須具有無參的公共建構函式
37. 需要實現對一個字串的處理,首先將該字串首尾的空格去掉,如果字串中間還有連續空格的話,僅保留一個空格,即允許字串中間有多個空格,但連續的空格數不可超過一個.
答:string inputStr=" xx xx ";
inputStr=inputStr.Trim();
inputStr=Regex.Replace(inputStr.Trim()," {2,}"," ");
注:Replace的第二個引數的”{2,}”前有一個空格,第三個引數是一個空格,表示,出現了2個或多個空格時將其替換成1個空格。
38.