1. 程式人生 > >c# 筆試題及參考答案大全

c# 筆試題及參考答案大全

1. c#中錯誤處理機制有哪些

    CLR提供的結構化錯誤處理機制,用try..catch..finally 捕獲


2. public/protect/private/internal修飾符的區別

    public:任何類和成員都可以訪問

    protect:該類和派生類能訪問

    private:只能該類訪問

    internal:只能在包含它的程式集中訪問


3. 大量資料(如3000萬條資料)併發處理時,有哪幾種機制

    儲存過程或事務.取得最大標識的時候同時更新,注意主鍵不是自增量方式.這種方法併發的時候是不會重複主鍵的,

    取得最大標識要有一個儲存過程來獲取.


4. String/StringBuilder的異同

    string是一個不可變的資料型別,一旦對字串物件進行了初始化,該字串物件就不能改變了。修改字串內容的方法

    和運算子實際上是建立一個新的字串.

    stringbuilder分配好記憶體,對字串的修改就在賦予stringbuilder例項的儲存單元中進行.

     舉例:

    string的確是不能修改的:  
    string  str  =  "a";  
    str  =  "b"//str是被賦值了"b"沒錯,但是str裡面原來的string值"a"並沒有被修改。  
    string  str  =  "a"; 
    string  str1  =  str;  
    str  +=  "b";//此時str  =  "ab",str1  =  "a"; 
       
    StringBuilder  str  =  new  StringBuilder(  "a"  ); 
    StringBuilder  str1  =  str;  
    str.Append(  "b"  );  
    str.ToString()和str1.ToString()都是"ab"。  
 
5. 解釋string str=null/string str=""

    str=null,宣告而不分記憶體空間,str=""宣告而分記憶體空間


6. 什麼是單例模式,寫個運用單例模式的類

    Singleton模式包含的角色只有一個,就是Singleton。Singleton擁有一個私有建構函式,確保使用者無法通過new直接

    例項它

// Singleton pattern -- Structural example  using System;

// "Singleton"class Singleton
{
  
// Fieldsprivatestatic Singleton instance;

 
// Constructor
protected Singleton() {}// Methodspublicstatic Singleton Instance()
{
  
// Uses "Lazy initialization"if( instance ==null )
     instance 
=new Singleton();

  
return instance;
  }

}
/**////<summary>/// Client test
///</summary>

publicclass Client
{
 
publicstaticvoid Main()
{
   
// Constructor is protected -- cannot use new   Singleton s1 = Singleton.Instance();
   Singleton s2 
= Singleton.Instance();

   
if( s1 == s2 )
     Console.WriteLine( 
"The same instance" );
 }

}


7. ASP.NET頁面間傳遞有哪幾種方式

    QueryString, response.Redirect(), session, server.Transfer 

 
8. 解釋過載/覆蓋
9. Web Services的含義/UDDI的含義

    Web服務是利用SOAP在HTTP上執行遠端方法呼叫的一種新方法。

    UDDI的含義:統一描述發現和整合(UDDI)提供一種釋出和查詢服務描述的方法。


10.虛擬函式/抽象函式各自的定義

    虛擬函式:由virtual宣告,它允許在派生類中被重寫,要重寫方法,必須先聲名為virtual 
public class myclass
{
    public virtual int myint()
    {
        函式體;
    }
}

class myclass1:myclass
{
    public override int myint()
   {
      函式體1;
   }
}

抽象類、抽象函式:由abstract宣告,在抽象類中可以定義抽象方法,抽象方法基本沒有執行程式碼,派生類必須重寫它,提供其執行程式碼
public abstract class myclass
{
     public abstract int myint();
}
public class myclass1:myclass
{
     public override int myint()
    {
      函式體;
    }
}

11.介面和類的異同

介面類:由interface宣告,是特殊的抽象類,是方法、屬性、事件和索引符的組合,沒有欄位,其成員無執行方式,無建構函式,不允許進行運算子過載,介面和它的成員沒有任何訪問修飾符,它總是公共的,不能宣告為虛擬或靜態,繼承自介面的派生類必須實現介面中的所有方法

interface Imyinterface
{
    void myfunction();
   string name
   {
     get;
     set;
   }
}
class myclass:Imyinterface
{
   void myfunction()
  {
    函式體;
   }
   string name
   {
     get
   {
     return name;
   }
   set
   {
    name=value;
    }
   }
}

介面是負責功能的定義,專案中通過介面來規範類,操作類以及抽象類的概念!
而類是負責功能的具體實現!

在類中也有抽象類的定義,抽象類與介面的區別在於:
抽象類是一個不完全的類,類裡面有抽象的方法,屬性,也可以有具體的方法和屬性,需要進一步的專業化。
但介面是一個行為的規範,裡面的所有東西都是抽象的!
一個類只可以繼承一個基類也就是父類,但可以實現多個介面

12.property/assembly區別


13.DataReader/DataSet區別

dataset表示一個數據集,是資料在記憶體中的快取。 可以包括多個表
DatSet 連線資料庫時是非面向連線的。把表全部讀到Sql中的緩衝池,並斷開於資料庫的連線
datareader 連線資料庫時是面向連線的。讀表時,只能向前讀取,讀完資料後有使用者決定是否斷開連線。


14.using/new各自的意義

using引入名稱空間或者說使用非託管資源new 新建例項或隱藏父類方法

15.一列數的規則如下: 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 > 0 && i <= 2)
                  return 1;
                  else return Foo(i -1) + Foo(i - 2); 
            } 
}

16.C#中的委託是什麼?事件是不是一種委託?
委託可以把一個方法作為引數代入另一個方法。 
委託可以理解為指向一個函式的引用。 
是,是一種特殊的委託

17.override與過載的區別

過載是方法的名稱相同。引數或引數型別不同,進行多次過載以適應不同的需要 
Override 是進行基類中函式的重寫

18.如果在一個B/S結構的系統中需要傳遞變數值,但是又不能使用Session、Cookie、Application,您有幾種方法進行處理?

QueryString、FormsAuthentication,Server.Transfer

19.請程式設計遍歷頁面上所有TextBox控制元件並給它賦值為string.Empty?
foreach (System.Windows.Forms.Control control in this.Controls)
{
     if (control is System.Windows.Forms.TextBox)
    {
           System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ;
           tb.Text = String.Empty ;
     }
}

foreach (System.Windows.Forms.Control controlinthis.Controls)
{
 
if (controlis System.Windows.Forms.TextBox)
  {
    System.Windows.Forms.TextBox tb
= controlas System.Windows.Forms.TextBox ;
   
if(tb!=null)
    {
      tb.Text
= String.Empty ;
    }
  }
}

20.請程式設計實現一個氣泡排序演算法?

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 ;
          } 
      }
}

21.描述一下C#中索引器的實現過程,是否只能根據數字進行索引?

    可以用任意型別

C#中的索引器通常用於索引陣列,樓上的THIS就是索引器了。
索引器不單能索引數字(陣列下標),還能索引一些HASHMAP的字串,所以,通常來說,C#中類的索引器通常只有一個,就是THIS,但也可以有無數個,只要你的引數列表不同就可以了
索引器和返回值無關

class A
{

int[] i=new int[10];

publib int this[int v]
{
return i[v];
}

22.求以下表達式的值,寫出您想到的一種或幾種實現方法: 1-2+3-4+……+m
if(m%2 == 1){
    S = (m + 1) / 2;
} else {
    S = -m / 2;
}

int Num = this.TextBox1.Text.ToString() ;
int Sum = 0 ;
for (int i = 0 ; i < Num + 1 ; i++)
{
if((i%2) == 1)
{
Sum += i ;
}
else
{
Sum = Sum - I ;
}
}
System.Console.WriteLine(Sum.ToString());
System.Console.ReadLine() ;

23.

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;x= 1 y = -1

24..什麼叫應用程式域?

應用程式域可以理解為一種輕量級程序。起到安全的作用。佔用資源小。

25.CTS、CLS、CLR分別作何解釋?

CTS:通用語言系統。CLS:通用語言規範。CLR:公共語言執行庫。

26.什麼是裝箱和拆箱?
從值型別介面轉換到引用型別裝箱。從引用型別轉換到值型別拆箱。

27.什麼是受管制的程式碼?

unsafe:非託管程式碼。不經過CLR執行。

28.什麼是強型別系統?
RTTI:型別識別系統。

29.在.net中,配件的意思是?
程式集。(中間語言,源資料,資源,裝配清單)

30.常用的呼叫WebService的方法有哪些?

1.使用WSDL.exe命令列工具。 
2.使用VS.NET中的Add Web Reference選單選項

31.net Remoting 的工作原理是什麼?
伺服器端向客戶端傳送一個程序編號,一個程式域編號,以確定物件的位置。

32.根據執行緒安全的相關知識,分析以下程式碼,當呼叫test方法時i>10時是否會引起死鎖?並簡要說明理由。
public void test(int i)
{
    lock(this)
    {
       if (i>10)
      {
       i--;
       test(i);
     }
   }
}

不會發生死鎖,(但有一點int是按值傳遞的,所以每次改變的都只是一個副本,因此不會出現死鎖。但如果把int換做一個object,那麼死鎖會發生

33..簡要談一下您對微軟.NET 構架下remoting和webservice兩項技術的理解以及實際中的應用。

WS主要是可利用HTTP,穿透防火牆。而Remoting可以利用TCP/IP,二進位制傳送提高效率。 
 remoting是.net中用來跨越machine, process, appdomain 進行方法呼叫的技術,對於三成結構的程式,就可以使用remoting技術來構建.它是分佈應用的基礎技術.相當於以前的DCOM   WebService是一種構建應用程式的普通模型,並能在所有支援internet網通訊的作業系統上實施。WebService令基於元件的開發和web的結合達到最佳,基於元件的物件模型 

34.公司要求開發一個繼承System.Windows.Forms.ListView類的元件,要求達到以下的特殊功能:點選ListView各列列頭時,能按照點選列的每行值進行重排檢視中的所有行 (排序的方式如DataGrid相似)。根據您的知識,請簡要談一下您的思路
根據點選的列頭,包該列的ID取出,按照該ID排序後,在給繫結到ListView中。

35..給定以下XML檔案,完成演算法流程圖。
<FileSystem>
< DriverC >
<Dir DirName=”MSDOS622”>
<File FileName =” Command.com” > </File>
</Dir>
<File FileName =”MSDOS.SYS” > </File>
<File FileName =” IO.SYS” > </File>
</DriverC>
</FileSystem>
請畫出遍歷所有檔名(FileName)的流程圖(請使用遞迴演算法)。

void FindFile( Directory d )
{
FileOrFolders = d.GetFileOrFolders();
foreach( FileOrFolder fof in FileOrFolders )
{
if( fof is File )
You Found a file;
else if ( fof is Directory )
FindFile( fof );
}
}

36.能用foreach遍歷訪問的物件需要實現 IEnumerable介面或宣告GetEnumerator方法的型別。

37.String s = new String("xyz");建立了幾個String Object?

兩個物件,一個是“xyx”,一個是指向“xyx”的引用對像s

38.啟動一個執行緒是用run()還是start()?
啟動一個執行緒是呼叫start()方法,使執行緒所代表的虛擬處理機處於可執行狀態,這意味著它可以由JVM排程並執行。這並不意味著執行緒就會立即執行。run()方法可以產生必須退出的標誌來停止一個執行緒。

39.介面是否可繼承介面? 抽像類是否可實現(implements)介面? 抽像類是否可繼承實體類(concrete class)?
介面可以繼承介面。抽像類可以實現(implements)介面,抽像類是可繼承實體類,但前提是實體類必須有明確的建構函式。

40.構造器Constructor是否可被override?

構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被過載Overloading。

41.是否可以繼承String類?
String類是final類故不可以繼承。

42.兩個對像值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?
不對,有相同的hash code

43.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

switch(expr1)中,expr1是一個整型,字元或字串,因此可以作用在byte和long上,也可以作用在string上。

44.當一個執行緒進入一個物件的一個synchronized方法後,其它執行緒是否可進入此物件的其它方法?
不能,一個物件的一個synchronized方法只能由一個執行緒訪問

45.abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?

都不能。

46.Set裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==還是equals()? 它們有何區別?
Set裡的元素是不能重複的,那麼用iterator()方法來區分重複與否。equals()是判讀兩個Set是否相等。
equals()和==方法決定引用值是否指向同一對像equals()在類中被覆蓋,為的是當兩個分離的物件的內容和型別相配的話,返回真值。

47.陣列有沒有length()這個方法? String有沒有length()這個方法?
陣列和string都沒有Length()方法,只有Length屬性。

48.sleep() 和 wait() 有什麼區別?

sleep()方法是將當前執行緒掛起指定的時間。
wait()釋放物件上的鎖並阻塞當前執行緒,直到它重新獲取該鎖。

49.short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?

short s1 = 1; s1 = s1 + 1;有錯,s1是short型,s1+1是int型,不能顯式轉化為short型。可修改為s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正確。

50.Session有什麼重大BUG,微軟提出了什麼方法加以解決?

是iis中由於有程序回收機制,系統繁忙的話Session會丟失,可以用Sate server或SQL Server資料庫的方式儲存Session不過這種方式比較慢,而且無法捕獲Session的END事件。

51.程序和執行緒的區別?

程序是系統進行資源分配和排程的單位;執行緒是CPU排程和分派的單位,一個程序可以有多個執行緒,這些執行緒共享這個程序的資源。

52.堆和棧的區別?
棧是編譯期間就分配好的記憶體空間,因此你的程式碼中必須就棧的大小有明確的定義;堆是程式執行期間動態分配的記憶體空間,你可以根據程式的執行情況確定要分配的堆記憶體的大小

53..成員變數和成員函式前加static的作用?
它們被稱為常成員變數和常成員函式,又稱為類成員變數和類成員函式。分別用來反映類的狀態。比如類成員變數可以用來統計類例項的數量,類成員函式負責這種統計的動作。

54..產生一個int陣列,長度為100,並向其中隨機插入1-100,並且不能重複

int[] intArr=new int[100];
ArrayList myList=new ArrayList();
Random rnd=new Random();
while(myList.Count <100)
{
int num=rnd.Next(1,101);
if(!myList.Contains(num))
myList.Add(num);
}
for(int i=0;i <100;i++)
intArr[i]=(int)myList[i];

        int[] aa = new int[100];
            int bb;
            List<int> ff = new List<int>();
            Random rd = new Random();
            while(ff.Count < 100)
            {
                bb = rd.Next(100);
                if (!ff.Contains(bb))
                {
                    ff.Add(bb);
                }
            }
            aa = ff.ToArray();

55.請說明在.net中常用的幾種頁面間傳遞引數的方法,並說出他們的優缺點。
session(viewstate) 簡單,但易丟失
application 全域性
cookie 簡單,但可能不支援,可能被偽造
input ttype="hidden" 簡單,可能被偽造
url引數 簡單,顯示於位址列,長度有限
資料庫 穩定,安全,但效能相對弱

56.請指出GAC的含義?

全域性程式集快取。

57.向伺服器傳送請求有幾種方式?
get,post。get一般為連結方式,post一般為按鈕方式。

58.軟體開發過程一般有幾個階段?每個階段的作用?

需求分析,架構設計,程式碼編寫,QA,部署

1。問題的定義與規劃 (可行性分析)  2.  需求分析   3.軟體設計。  4  軟體編碼  5系統測試

59..在c#中using和new這兩個關鍵字有什麼意義,請寫出你所知道的意義?

using 引入名稱空間或者使用非託管資源
new 新建例項或者隱藏父類方法

60.需要實現對一個字串的處理,首先將該字串首尾的空格去掉,如果字串中間還有連續空格的話,僅保留一個空格,即允許字串中間有多個空格,但連續的空格數不可超過一個.
string inputStr=" xx xx ";
inputStr=Regex.Replace(inputStr.Trim()," *"," ");

61.下面這段程式碼輸出什麼?為什麼?

int i=5;
int j=5;
if (Object.ReferenceEquals(i,j))
Console.WriteLine("Equal");
else
Console.WriteLine("Not Equal");
不相等,因為比較的是對像

62.什麼叫做SQL注入,如何防止?請舉例說明。
利用sql語言漏洞獲得合法身份登陸系統。如身份驗證的程式設計成:
SqlCommand com=new SqlCommand("Select * from users where username='"+t_name.text+"' and pwd='"+t_pwd.text+"'");
object obj=com.ExcuteScale();
if(obj!=null)
  {
    //通過驗證
  }
這段程式碼容易被sql注入。如使用者在t_name中隨便輸入,在t_pwd中輸入1' and 1='1  就可以進入系統了。

63.什麼是反射?
動態獲取程式集資訊

64.常用關鍵字

     abstract 可以和類、方法、屬性、索引器及事件一起使用,
  標識一個可以擴充套件但不能被實體化的、必須被實現的類或方法。
  as 一個轉換操作符,如果轉換失敗,就返回null。
  base 用於訪問被派生類或構造中的同名成員隱藏的基類成員。
  catch 定義一個程式碼塊,在特定型別異常丟擲時,執行塊內程式碼。
  參見try和finally。
  checked 既是操作符又是語句。
  確保編譯器執行時,檢查整數型別操作或轉換時出現的溢位。
  const 標識一個可在編譯時計算出來的變數值,即一經指派不可修改的值。
  delegate 指定一個宣告為一種委託型別。委託把方法封裝為可呼叫實體,
  能在委託實體中呼叫。
  enum 表示一個已命名常量群集的值型別。
  event 允許一個類或物件提供通知的成員,他必須是委託型別。
  explicit 一個定義使用者自定義轉換操作符的操作符,
  通常用來將內建型別轉換為使用者定義型別或反向操作。
  必須再轉換時呼叫顯示轉換操作符。
  extern 標識一個將在外部(通常不是c#語言)實現的方法。
  finally 定義一個程式碼塊,在程式控制離開try程式碼快後執行。參見try和catch。
  fixed 在一個程式碼塊執行時,在固定記憶體位置為一個變數指派一個指標。
  foreach 用於遍歷一個群集的元素。
  goto 一個跳轉語句,將程式執行重定向到一個標籤語句。
  implicit 一個操作符,定義一個使用者定義的轉換操作符。
  通常用來將預定義型別轉換為使用者定義型別或反向操作。
  隱式轉換操作符必須在轉換時使用。
  interface 將一個宣告指定為介面型別,即實現類或構造必須遵循的合同。
  internal 一個訪問修飾符。
  namespace 定義一個邏輯組的型別和名稱空間。
  operator 用來宣告或多載一個操作符。
  out 標識一個引數值會受影響的引數,但在傳入方法時,
  該引數無需先初始化。
  params 宣告一個引數陣列。如果使用,必須修改指定的最後一個引數。
  允許可選引數。
  readonly 標識一個變數的值在初始化後不可修改。
  ref 標識一個引數值可能會受影響的引數。
  sealed 防止型別被派生,防止方法和property被覆載。
  sizeof 一個操作符,以byte為單位返回一個值型別的長度。
  stackalloc 返回在堆上分配的一個記憶體塊的指標。
  struct struct是一種值型別,可以宣告常量、欄位、方法、property、
  索引器、操作符、構造器和內嵌型別。
  throw 丟擲一個異常。
  try 異常處理程式碼塊的組成部分之一。try程式碼塊包括可能會
  丟擲異常的程式碼。參閱catch和finally關鍵字。
  typeof 一個操作符,返回傳入引數的型別。
  unchecked 禁止溢位檢查。
  unsafe 標註包含指標操作的程式碼塊、方法或類。
  using 當用於名稱空間時,using關鍵字允許訪問該名稱空間中的型別,
  而無需指定其全名。也用於定義finalization操作的範圍。
  virtual 一個方法修飾符,標識可被覆載的方法。
  volatile 標識一個可被作業系統、某些硬體裝置或併發執行緒修改的attribute。

65.public static const int A=1;這段程式碼有錯誤麼?是什麼?
     const成員都是static所以應該去掉static

66.float f=-123.567F;
    int i=(int)f;
    i的值現在是_____?

   -123

67.利用operator宣告且僅聲明瞭==,有什麼錯誤麼? 
要同時修改Equale和GetHash() ? 過載了"==" 就必須過載 "!="

68.在Asp.net中所有的自定義使用者控制元件都必須繼承自________?

System.Web.UI.UserControl

69.在.Net中所有可序列化的類都被標記為_____?

 [serializable]

70..下面的程式碼中有什麼錯誤嗎?_______
    using System;
    class A
    {
          public virtual void F(){
              Console.WriteLine("A.F");
          }
      }
      abstract class B:A
      {
          public abstract override void F();
      }

abstract override 是不可以一起修飾

71.當類T只聲明瞭私有例項建構函式時,則在T的程式文字外部,______(可以 or 不可以)從T
   派生出新的類,____(可以 or 不可以)直接建立T的任何例項。

不可以,不可以

72..在.Net中,類System.Web.UI.Page 可以被繼承麼?
可以

73.c#實現約瑟夫環問題

public static int[] Joseph(int total, int start, int alter){

           int j, k = 0;

        int[] count = new int[total];

        int[] s = new int[total];

        for (int i = 1; i < total + 1; i++){

             s[i - 1] = i;

        }

        for (int i = total; i >= 2; i--){

             start = (start + alter - 1) % i;

             if (start == 0){

                 start = i;

              }

             count[k] = s[start - 1];

             k++;

             for (j = start; j < i; j++){

                  s[j - 1] = s[j];

             }

         }

         count[k] = s[1];

         return count;

    }

74.知abc+cba = 1333,其中a,b,c均為一位數,程式設計求出滿足條件的a,b,c所有組合

for (int a = 1; a < 10; a++){

       for (int b = 1; b < 10; b++){

              for (int c = 1; c < 10; c++) {

                 if (100 * a + 10 * b + c + 100 * c + 10 * b + a == 1333)

                 {

                  Console.WriteLine(a.ToString() + b.ToString() + c.ToString());

                 }

              }

       }

   }

75.用100元買100支筆,其中鋼筆3元/支,圓珠筆2元/支,鉛筆0。5元/支,求幾種組合

for (int a = 1; a < 100/3; a++){

      for (int b = 1; b < 100/2; b++{

             for (int c = 1; c < 100/0.5; c++){

               if ((a+b+c == 100) && (3*a + 2*b + 0.5*c == 100)) {

      Console.WriteLine(a.ToString() + "--" + b.ToString() + "--" + c.ToString());

               }

            }

       }

  }

76.倒置陣列a的元素到b

int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

int[] b = Reversel(a);

public static int[] Reversel(int[] a)

{

    int[] b = new int[a.Length];

    for (int i = 0; i < a.Length; i++)

    {

        b[i] = a[a.Length - 1 - i];

    }

    return b;

}

77.倒置陣列a裡的元素

int[] c = ReverselSelf(a);

public static int[] ReverselSelf(int[] a)

{

    int temp = 0;

    for (int i = 0; i < a.Length / 2; i++)

    {

        temp = a[i];

        a[i] = a[a.Length - 1 - i];

        a[a.Length - 1 - i] = temp;

    }

    return a;

}

78.設計一個函式,在陣列的第i個下標前插入一個數據元素,並保持陣列元素的連續性

int[] a = { 0,1,2,3,4,5,6,7,8,9};

int[] b = InsertItem(a,5,11);

public static int[] InsertItem(int[] a, int i, int item)

{

    int[] a1 = new int[i + 1];

    int[] a2 = new int[a.Length - i];

    for (int j = 0; j < a.Length; j ++ )

    {

        if (j < i)

        {

            a1[j] = a[j];

        }

        else

        {

            a2[j - i] = a[j];

        }

    }

    a1[i] = item;

    int[] b = new int[a.Length + 1];

    a1.CopyTo(b,0);

    a2.CopyTo(b, i + 1);

    return b;

}

79.設計一個函式,刪除陣列第i個下標的資料元素,並保持陣列元素的連續性

int[] a = { 0,1,2,3,4,5,6,7,8,9};

int[] c = DeleteItem(a,5);

public static int[] DeleteItem(int[] a, int i)

{

    int[] c = new int[a.Length - 1];

    for (int j = 0; j < a.Length; j ++ )

    {

        if (j < i)

        {

            c[j] = a[j];

        }

        else if (j == i) { continue; }

        else if (j > i)

        {

            c[j - 1] = a[j];

        }

    }

    return c;

}

.net面試寶典

1。試解釋如下兩個概念 : CLR,CTS
公共語言執行時,公共型別系統

2。property 和 attribute 的區別是什麼?
屬性,
特性 ,描述程式碼或行為

3.net現在是什麼版本?談談net各版本的相容性

4.什麼是強型別?什麼弱型別?c#是強型別還是弱型別?javascript呢?
型別檢查的嚴格程度,C#是強型別,javascript是弱型別

5.什麼是gac?
全域性程式集快取

6.解釋下c#與c++有什麼區別?
c#  託管    net虛擬機器  完全面向物件  無多重繼承
c++ 非託管  不需要     部分面向物件  有多重繼承

7.引用型別和值型別區別是什麼?
引用型別  繼承自system.object    引用在棧上  實際值在堆上
值型別          system.valuetype 在棧上

8.解釋一下裝箱和拆箱。為什麼要裝箱和拆箱?
裝箱就是將值型別轉換成引用型別,並從棧中搬到堆中。而拆箱就是把引用型別轉換成值型別

9. explicit 和 implicit 的區別是什麼
型別顯式轉換和隱式轉換

10. DateTime 是否可以為null
不能,datetime為值型別

11.DateTime.Parse(mystring);這行程式碼有什麼問題?
Date.TryParse()

12.extern是什麼意思?
外部實現方法

13.編寫一段程式碼,列印程式碼本身
 static class Program
    {
        [STAThread]
        static void Main()
        {
            string s = "static class Program{{static void Main(){{string s ={1}{0}                        {1};System.Console.WriteLine(s,s,(char)34);}}}}";
            System.Console.WriteLine(s,s,(char)34);
        }
    }

14.談談final,finally,finalize的區別
防止重寫,
try{}catch{}
在垃圾回收之前,嘗試釋放資源並執行其他清理操作


15.const和static readonly 區別是什麼?
編譯時常量
執行時常量

16.定製異常類應繼承哪個類?應包含哪些建構函式?
ApplicationException

class ClassException:ApplicationException
    {
        public ClassException();
        public ClassException(string message);
        public ClassException(string message, Exception innerException);
    }

17.請輸出下列程式結果

 static void Main()
        {
            int x = 20;
            int y = 40;
            GetPlus(ref x, y);
            Console.Write(x.ToString() + y.ToString());
        }

        private static void GetPlus(ref int x, int y)
        {
            x = x + y;
            y = x + y;
        }

x=60,y=40

18.在c#中,a.Equals(b)和a==b一樣嗎?

a.Equals(b)  成員值一樣

a==b 同一個引用

19.呼叫assembly.Load算靜態引用還是動態引用?

動態引用

20.何時使用assembly.loadform?何時使用assembly.loadfile?

assembly.loadform,全部載入,包括依賴

assembly.loadfile,只加載所需檔案,有可能出錯

21.什麼是assembly qualified name?它是一個檔名嗎?

包括檔名,版本,公鑰,區域

22.assembly.load("foo.dll");這樣的寫法是否正確?

錯誤, assenbly.load("foo");  assembly.loadform("foo.dll");

23.程式集的強名包含哪幾部分?

簡單名,版本號,文化資訊,公鑰令牌

24.哪兩個類不能例項化?

抽象類或者包含私有建構函式的類

25. 下面程式輸出結果是什麼?

 class Class1
    {
        public static int count = 0;
        static Class1(){
            count++;
        }
        public Class1()
        {
            count++;
        }
    }

 static void Main()
        {
            Class1 o1 = new Class1();
            Class1 o2 = new Class1();
            int a = Class1.count;
        }

a=3;

只有在第一次例項化的時候才啟動static Class1()函式,以後再例項化時該函式不起作用

26.為什麼虛擬函式效率低?

間接定址

27.new的用法

運算子

修飾符

約束

2.       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;