C# 面試題及答案

  1. 分析如下代碼

          

1  string str = "abc123中文漢字";
2 
3             int i = System.Text.Encoding.Default.GetBytes(str).Length;
4 
5             int j = str.Length;
6 
7             Console.WriteLine(i);
8 
9         Console.WriteLine(j);

 

答案:i=14;i=10;html

2.請輸出B.test()的輸出結果vue

 1 class A
 2 {
 3 int i = 1;
 4 public virtual void M1()
 5 {
 6 Console.WriteLine(" i am A ");
 7 }
 8 public void M2()
 9 {
10 Console.WriteLine(" i ={0} ",i);
11 }
12 }
13 
14 class B:A
15 {
16 int i = 2;
17 public override void M1()
18 {
19 Console.WriteLine(" i am B ");
20 }
21 public new void M2()
22 {
23 Console.WriteLine(" i ={0} ", i);
24 }
25 }
26 
27 static void Main(string[] args)
28 
29 {
30 
31 B b = new B();
32 A a = b;
33 a.M1();
34 b.M1();
35 a.M2();
36 b.M2();
37 
38 }

 

答案: i am B;node

i am B;web

1;ajax

2;算法

3.有序集合seqList{1,1,2,3,5,8,13,21,34.........}請查找集合中第一個大於2147483647的數。數據庫

答案:此函數是有名的斐波那契數。實現此函數的方法爲編程

 1 //遞歸寫法
 2 public int foo(int n)
 3 {
 4 if(n<2) return 1;
 5 else return foo(n-2)+foo(n-1)
 6 }
 7 
 8 //循環寫法
 9 public int[] foo2(int n)
10 {
11 if(n==1) return new int{1};
12 else if(n==2) return new int{1,1};
13 else
14 {
15 int rel[]=new rel[n];
16 rel[0]=1;
17 rel[1]=1;
18 for(int i=2;i<n;i++)
19 {
20     rel[i]=rel[i-2]+rel[i-1];
21 }
22 }
23 }

 

查找大於2147483647的數用二分法查找。json

    private static int FibonacciSearch(int[] array, int key) {
        int length = array.Length;
        int low = 0, high = length - 1, mid, k = 0;
        mid=(low+high )/2
        while(mid<high)
{
   if(array[mid]==key){return mid;break;}
else if(array[mid]>key){high=mid;mid=(low+high )/2;}
else if(array[mid]<key){low=mid;mid=(low+high )/2;}
}
}

4.簡述如下詞在C#語言中的做用c#

volatile:(建立單例模式時會使用,懶漢模式)就像你們更熟悉的const同樣,volatile是一個類型修飾符(type specifier)。它是被設計用來修飾被不一樣線程訪問和修改的變量。若是不加入volatile,基本上會致使這樣的結果:要麼沒法編寫多線程程序,要麼編譯器失去大量優化的機會。做爲指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值.,簡單地說就是防止編譯器對代碼進行優化.好比以下程序:

1
2
3
4
XBYTE[2]=0x55;
XBYTE[2]=0x56;
XBYTE[2]=0x57;
XBYTE[2]=0x58;
對外部硬件而言,上述四條語句分別表示不一樣的操做,會產生四種不一樣的動做,可是編譯器卻會對上述四條語句進行優化,認爲只有XBYTE[2]=0x58(即忽略前三條語句,只產生一條機器代碼)。若是鍵入volatile,則編譯器會逐一的進行編譯併產生相應的機器代碼(產生四條代碼). 原文引用 http://www.javashuo.com/article/p-fuyozdvq-bw.html
interlocked:爲多個線程共享的變量提供原子操做(僅限int類型)。 微軟原文https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.interlocked?view=netframework-4.7.2    我的微博原文:https://www.cnblogs.com/Zachary-Fan/p/interlocked.html
monitor:lock:(lock是一種混合鎖,至關於Monitor.Enter(object)方法是獲取鎖,Monitor.Exit(object)方法是釋放鎖的組合)詳見原文http://www.javashuo.com/article/p-wimwgrpx-gh.html
 
ReaderWriterLock:字面意思,讀寫鎖,分爲讀鎖和寫鎖,多個線程讀一個對象, 而只有一個線程要寫這個對象. 那麼對於讀線程來講, 它不改變對象的內容, 咱們就應該容許多個線程同時讀, 只有在寫的時候纔要給鎖住對象. 這樣能夠提升讀線程的吞吐量。詳見原文 https://blog.csdn.net/changtianshuiyue/article/details/16943499
 
AutoResetEvent|   ManualResetEvent  字面意思爲自動重置事件和手動重置事件,這兩個類能夠理解爲設置信號,來進行阻塞線程或者讓線程從新啓動。上原文http://www.javashuo.com/article/p-gspqvjwc-ch.html
 
Semaphore 信號量,經過計數器設置能夠訪問的線程數目例如設置爲10,則能夠同時有10個線程訪問此資源,每當有一個線程訪問此資源,則信號量減1,訪問完成以後釋放則加1,當信號量=0時禁止訪問,阻塞線程,當信號量>0時,能夠訪問。原文https://www.cnblogs.com/tianzhiliang/archive/2010/08/31/1813635.html
 
Mutex   互斥量,嗯。。。提及來挺麻煩,仍是看原文吧。http://www.javashuo.com/article/p-rdfeytxu-co.html
 
5.MVC平臺,網頁設計textbox控件時,編輯代碼有四種形式,如下已經寫出了第一種,請寫出後三種。
@using MvcViewModelTest.Models
1 //第一種 
2 <input id="tea_Name" name="tea.Name" type="text" value="馬老師"/>
3 //第二種
4 @Html.TextBox("tea.Name",Model.tea.Name)
5 //第三種
6 @Html.TextBoxFor(m=>m.tea.Name)
7 //第四種
8 @Html.TextEditorFor(m=>m.tea.Name)

6.用一條SQL語句 查詢出每門功課都大於80分的學生姓名,表結構以下

姓名   課程   分數  
張三 語文 81
張三 數學 75
張三 英語 82
李四 語文 76
李四 數學 90
李四 英語 82
王五 語文 81
王五 數學 100
王五 英語 92

 

 

 

 

 

 

 

 

答案一:select 姓名 from 表 where 姓名 not in (select 姓名 from 表 where 分數<=80)

答案二(推薦):select 姓名 from 表  group by 姓名 having min(分數)>80

7.簡述Vue中methods、computed以及watch的用法及區別。

1#computed:計算屬性將被混入到 Vue 實例中。全部 getter 和 setter 的 this 上下文自動地綁定爲 Vue 實例。

2#methods:methods 將被混入到 Vue 實例中。能夠直接經過 VM 實例訪問這些方法,或者在指令表達式中使用。方法中的 this 自動綁定爲 Vue 實例。

3#watch:是一種更通用的方式來觀察和響應 Vue 實例上的數據變更。一個對象,鍵是須要觀察的表達式,值是對應回調函數。值也能夠是方法名,或者包含選項的對象。Vue 實例將會在實例化時調用 $watch(),遍歷 watch 對象的每個屬性。
 官方API地址https://cn.vuejs.org/v2/api/#computed

我的博客:https://blog.csdn.net/smartdt/article/details/75557369

8.現有一個業務系統有4萬用戶,全部用戶天天產生6千萬數據,系統要求快速查詢60天數據,請給出你的實現方案。

9.描述你曾經或者正在使用的大型項目解決方案。

10.什麼時候必須聲明一個類爲抽象類?

答案:當這個類中包含抽象方法時,或是該類並無徹底實現父類的抽象方法時。

11.MVC框架中,ActionResult,JsonResult,ContentResult哪一個能夠return view()?

答案:ActionResult。

12.Aspx頁面中,updatepanel的做用是什麼?

答案:UpdatePanel控制頁面的局部更新。(局部更新控件)、

13.MVC框架中,當使用Get方法訪問JsonResult時,可否直接採用如下寫法:return json(obj).爲何?

答案:不能,要使用 res.JsonRequestBehavior = JsonRequestBehavior.AllowGet;//容許使用GET方式獲取,不然用GET獲取是會報錯。 

14.能夠採用foreach迭代的類的對象必須知足什麼條件?

答案:須要實現IEnumerable接口或聲明GetEnumerator方法的類型。注:不必定要實現IEnumerable接口,但必定要實現GetEnumrator方法。

15.在dotnet環境下,如何把數據庫數據轉換爲XML格式輸出?

將數據庫的內容讀取到dataTable或dataSet中,dataTable或dataSet轉爲xml。

private string ConvertDataTableToXML(DataTable xmlDS) //DataTable可改用dataset
    {
        MemoryStream stream = null;
        XmlTextWriter writer = null;
        try
        {
            stream = new MemoryStream();
            writer = new XmlTextWriter(stream, Encoding.Default);
            xmlDS.WriteXml(writer);
            int count = (int)stream.Length;
            byte[] arr = new byte[count];
            stream.Seek(0, SeekOrigin.Begin);
            stream.Read(arr, 0, count);
            UTF8Encoding utf = new UTF8Encoding();
            return utf.GetString(arr).Trim();
        }
        catch
        {
            return String.Empty;
        }
        finally
        {
            if (writer != null) writer.Close();
        }
    }

 

16.Html頁面上,有以下代碼<input type="button"  name ="btndel" onclick="Del()"/>.如今要求用戶點擊刪除後,彈出刪除確認的對話框,並在點擊肯定後彈出對話框「」「刪除完畢」,用JS如何實現。

答案:

1 function Del()
2 {
3 if(confirm("肯定刪除"))
4       alert("刪除成功")
5 }

17.請寫出一個json的例子。

答案:[{"id":"123","name":"huawei"}]

18.List<Domain1> Alist 中有100個Domain1元素,且每一個Domain1元素都有屬性string  typStr,如今須要取出AList中全部typeStr="Atype"的元素,並組成新的List,該如何實現。

答案:

1 List<string> BList=new List<string>();
2 foreach(var a in AList)
3 {
4 if(a.typeStr=="Atype")
5     Blist.add(a.typeStr);
6 }

19.EF框架中,使用DBFirst時數據庫中的表A沒有主鍵,可否經過「從數據庫更新模型「操做,將表A導入到EF框架中。

答案:不能,表必需要有主鍵,不然會報錯。

savechange()方法返回0,而不是正常的大於0的書。切記設置主鍵。

返回錯誤InnerException = {"沒法更新 EntitySet「t_Customer」,由於它有一個 DefiningQuery,而 <ModificationFunctionMapping> 元素中沒有支持當前操做的 <InsertFunction> 元素。"}。

在發現錯誤後要吧原有的數據庫的表刪除,從新更新。若是不刪除的話,沒法更新,而且要從新生成解決方案。
20.foreach和for循環誰的效率高?switch和if呢?

答案:foreach高,for 循環每次都要進行判斷i的大小,foreach 依賴 IEnumerable.第一次 var a in GetList() 時 調用 GetEnumerator 返回第一個對象 並 賦給a,之後每次再執              行 var a in GetList() 的時候 調用 MoveNext.直到循環結束。期間GetList()方法只執行一次.

        一樣的道理:當有多個判斷時,switch更快。

21.WebService基於什麼協議?

 答案:soap協議,而Soap創建在http上的。

22.WebService和WebAPI 有什麼不一樣。   

一、webservice是基於SOAP協議的,數據格式是XML,webapi遵循的http協議,它的Response能夠被而Web API的MediaTypeFormatter轉換成Json、XML 或者任何你想轉換的格式。
二、webservice它只能部署在IIS上,而webapi能夠寄宿在不一樣的宿主上(寄宿的本質就是利用一個具體的應用程序爲Web Api提供一個運行的環境,並解決請求的接收和響應的回覆),如Web Host,Self Host方式
三、webservice 也能夠經過ajax訪問。

四、webapi無狀態,相對webservice更輕量級。webapi支持如get,post等http操做,而且對限制帶寬的設備,好比智能手機等支持的很好。

這樣對比的話webservice貌似並很差用。可是咱們爲何要用它呢,理由以下:

一、很好的跨編程語言和跨操做系統
二、可移植性:傳統的WebService只是利用了HTTP通道,進行獨立的交互,可是這個交互協議能夠移植到其餘協議下運做

 

23.C#是否支持多重繼承?

答案:不支持。多重繼承指的是一個類能夠同時繼承多個類,好比A類繼承自B類和C類,這就是多重繼承。C#只能繼承一個類,可是能夠繼承多個接口。

24.修飾符protected internal 的意思?

internal修飾的b在同一個項目中哪裏均可以訪問,而在另一個項目中就不能訪問,說明「同一程序集」指的是同一個項目;對於protected internal修飾的a在同一項目中哪裏均可以訪問,而在其它項目中只有在派生類能夠訪問,因此protected internal 修飾的成員變量是同一程序集或者派生類能夠訪問,也就是protected跟internal的並集,而不是交集。(被protected internal修飾的屬性/方法只能在它的在同一個程序集(Assembly)中的子類被訪問)查資料找到了兩種說法,不知道哪一種是對的,我的覺得是第一種是對的。

25.bs架構下,能否聲明一個靜態的數據庫鏈接對象,全部的業務類都引用該靜態鏈接對象去訪問數據庫?

答案:一個靜態的Sqlconnection來管理項目內全部的數據庫鏈接在絕大部分場景是不合理的
(沒說絕對不可行,在winform單線程項目中,這樣作是沒有問題的,由於操做者是一個用戶,每一個用戶都有一份程序副本)
若是是多個用戶提交的請求是
同一個AppDomain中的函數,方法(這種說話不嚴謹,不過我暫時找不到更好的表達方式)
來處理時.都是用同一個靜態的Sqlconnection對象是不行的.
會引發併發問題,會引發相互干擾.還須要加鎖lock才能操做.

26.C#提供了一個默認的無參數構造函數,當我實現了另一個有一個參數的構造函數的時候,還想保留這個無參數的構造函數。這樣我應該寫幾個構造函數?

答案:兩個。

27.可以阻止某一個類被其餘類繼承麼?可以實現容許某個類被繼承,但不容許其中某個方法被覆寫嗎?

答案:(1)當對一個類應用 sealed 修飾符時,此修飾符會阻止其餘類從該類繼承,(2)能夠,標記這個類爲public,並標記這個方法爲sealed.

28.什麼是強類型?C#是強類型嗎,JS呢?

答案:強類型指的是程序中表達的任何對象所從屬的類型都必須能在編譯時刻肯定。常見的強類型語言有C++JavaApexPython等,C#是強類型,JS不是。

29.金額等精確的數值聲明爲何類型?

答案:float,double,decimal

30.讀寫數據庫都須要哪些對象,簡要說明其做用。

答案一、 Connection:與數據源創建鏈接。
二、 Command:對數據源執行SQL命令並返回結果。
三、 DataReader:讀取數據源的數據,只容許對將數據源以只讀、順向的方式查看其中所存儲的數據。其經常使用於檢索大量數據,DataReader對象仍是一種很是節省資源的數據對象
四、 DataAdapter:對數據源執行操做並返回結果,在DataSet與數據源之間創建通訊,將數據源中的數據寫入DataSet中,或根據DataSet中的數據綁定數據源。
五、 DataSet:內存中的數據庫,是數據表的集合,它能夠包含任意多個數據表

31.經過程序控制GC的強制回收是否能夠提升效率?

答案:我的覺得是能夠的(在網上沒找到答案),GC是循環遍歷全部資源的,若是你已經強制回收了,那麼遍歷的就會少,從而提升效率。

32.int?和int的區別。

答案:int?爲可空類型,能夠是null,他是經過把int裝箱爲引用類型實現的。

33.求數列(1,1,2,3,5,8,13。。。。)的和。

答案:見第三題的循環寫法,定義一個變量爲sum,sum+=arr[I]

34.BS架構下,在session中存儲了一個datatable的對象y,y在何時會被GC回收?這種存儲數據的方式是否合理?若是Application增長了對y的引用,何時會被GC回收?

答案:在session的生命週期結束以後回收,不合理,每一個session儲存在服務器端的內存裏,每一個用戶都會有一個獨立的session,若是session的內容過於複雜,當大量的用戶訪問的時候會致使內存溢出。Application是全部用戶共有的,因此應該不會被回收(我的理解)

35.string和stringbuilder的區別。

答案:System.String是不可變的字符串。System.StringBuilder存放了一個可變的字符串,並提供一些對這個字符串修改的方法

36.舉例寫一個單例模式

 1 public class Singleton
 2     {
 3         private static Singleton _Singleton = null;
 4         private static object Singleton_Lock = new object();
 5         public static Singleton CreateInstance()
 6         {
 7             if (_Singleton == null) //雙if +lock
 8             {
 9                 lock (Singleton_Lock)
10                 {
11                     Console.WriteLine("路過。");
12                     if (_Singleton == null)
13                     {
14                         Console.WriteLine("被建立。");
15                         _Singleton = new Singleton();
16                     }
17                 }
18             }
19             return _Singleton;
20         }
21     }

37.描述一下virtual、sealed、override和abstract的區別。

答案:

virtual申明虛方法的關鍵字,說明該方法能夠被重寫

sealed說明該類不可被繼承

override重寫基類的方法

abstract申明抽象類和抽象方法的關鍵字,抽象方法不提供實現,由子類實現,抽象類不可實例化。

38.List<int> listNumber,其中存儲了從1到100的數字,現須要將ListNumber按照形如「1,2,3,4.。。」輸出,請寫出相應的代碼。

1 foreach(var a in listNumber.sort())
2 {
3   Console.WriteLine(a);
4 }

39.int,string,hashtable,datetime,datatable中哪些是引用類型?

答案:string,hashtable,datatable

40.一棵二叉查找樹(Binary Seach Tree)具備如下特色,樹中的任一節點,若是左子樹不爲空,則左子樹的全部節點的值都小於該節點的值,若是右子樹不爲空,那麼右子樹全部節點的值都大於該節點的值;任一個節點的左右子樹都是二叉查找樹,示意圖以下

假設二叉查找樹的節點定義以下:

1 Class BSTreeNode{
2 int value;
3 BSTreeNode leftChild;
4 BSTreeNode rightChild;
5 }

要實現一個方法printRang:按從小到大的順序輸出範圍在【min,max】之間的全部值。請寫出你認爲最高效的代碼。

 1 void printRang(BSTreeNode btsnode,int min,int max)
 2 {
 3 //中序遍歷,大於min的輸出,小於max的不輸出
 5 //循環這裏使用棧輔助進行遍歷
 6 System.Collections.Generic.Stack<Tree> stack = new System.Collections.Generic.Stack<Tree>();
 7 while(btsnode != null || stack.Any())
 8 {
 9 if(btsnode.value>max)break;
10 else if (btsnode != null)
11                 {
12                      stack.Push(btsnode);
13                     btsnode = btsnode.Left;
14                 }
15                 else
16                 {
17                     var item = stack.Pop();
18                     if(item.Value>=min&&item.Value<=max)
19                           Console.WriteLine(item.Value);
20                     btsnode = item.Right;
21                 } 
23 }
24 }

41.請寫出一段在多線程運行時有可能產生死鎖(不須要必定產生)的代碼。

 1 int string a="aaaa",b="bbbb";
 2 public void Seta(){
 3 lock(b)
 4 {
 5 a="bbbb";
 6 }
 7 }
 8 public void Setb(){
 9 lock(a)
10 {
11 b="aaaa";
12 }
13 }
14 
15   Thread t = new Thread(Seta);  
16   Thread.Sleep(5000);
17   t.Start();  
18   Thread t2 = new Thread(Setb);  
19   Thread.Sleep(5000);
20   t2.Start();  

42.假設你的編程語言提供這樣的異步機制,把一個任務放在一個線程池中執行,當前線程繼續執行,直到調用這個任務取返回值的方法時才阻塞並等待任務完成拿到返回值。

如今有這樣一個場景,收到一個客戶端的訂單請求要檢查商品的庫存可否知足,查詢該客戶按照當前的價格策略可否享受訂單的折扣才能接受訂單,而這兩個檢查都是很是耗時的操做。原來的代碼是這樣的:

1 public booleanprocessOrder(Order order)
2 {
3 if(!checkCustomerprice(order))
4 return false;
5 if(!checkInventory(order))
6 return false;
7 //訂單邏輯代碼不須要關注
8 return true;
9 }

請用上述的異步機制改寫這段代碼,減少這個方法的響應延遲。

 1 //這裏使用task
 2 Task<bool> task = new Task<bool>(() => checkCustomerprice());
 3 task.Start();
 4 bool result = task.Result;
 5 
 6 Task<bool> task2 = new Task<bool>(() => checkInventory());
 7 task2.Start();
 8 bool result2 = task2.Result;
 9 
10 if(result&&result2)
11    return true;
12 else 
13    return  false;
14 
15 //本身研究寫的,不知道對不對,僅供參考

43.簡述private,protected,public,internal修飾符的訪問權限。

   public(公共的) 徹底公開,訪問不受限制。

   protected(保護的) 訪問僅限於包含類或從包含類派生的類型。該類內部和繼承類中能夠訪問。

   internal(內部的) 訪問僅限於當前程序集。在同一命名空間內能夠訪問。

   protected internal(內部保護的) 訪問僅限於從包含類派生的當前程序集或類型(待肯定)。

   private(私有的) 訪問僅限於包含類型。在類的內部才能夠訪問

44.ado.net的五個主要對象。答案見第30題。

45.列舉asp.net頁面之間傳值的幾種方式。

答案:

Request.Form["SourceData2"].ToString();
Request.QueryString["parameter1"].ToString();
 Context.Items["value"].ToString();還有cookie,session,application
46.C#中委託是什麼?事件是否是一種委託?事件和委託的關係。
答案:委託是指向事件的一種函數指針,把事件轉換爲了一種引用類型的變量,可讓其餘函數調用。(純純的我的理解,網上有不一樣答案,我也不知道哪一個是對的,建議找出版的資料。)
47.override(重寫)與重載overload的區別。
答案:override是重寫(覆蓋)了一個方法,以實現不一樣的功能。通常是用於子類在繼承父類時,重寫(從新實現)父類中的方法,
重載,通常是用於在一個類內實現若干重載的方法,這些方法的名稱相同而參數形式不一樣。
48.MVC模式。(我並無徹底GET到這個考點)
答案:MVC 模式表明 Model-View-Controller(模型-視圖-控制器) 模式。這種模式用於應用程序的分層開發。
49.什麼是裝箱和拆箱?
答案:值類型轉換爲引用類型是裝箱,引用類型裝換爲值類型是拆箱。
50.什麼叫應用程序域AppDomain。
答案: "域",就是範圍,環境,邊界的意思,那麼什麼是應用程序域,官方給出的是這樣的解釋:操做系統和運行庫環境一般會

在應用程序間提供某種形式的隔離.

     應用程序域爲安全性、可靠性、版本控制以及卸載程序集提供了隔離邊界。應用程序域一般由運行庫宿主建立,

運行庫宿主負責在運行應用程序以前引導公共語言運行庫。

  應用程序域本質上就就是一種隔離,目的也就是使應用程序中運行的代碼不能直接訪問其餘應用程序中的代碼或資

源若是你須要訪問其餘應用程序中的對象時你就能夠複製這些對象,或經過代理訪問這些對象.

51.堆和棧的區別。

答案:heap:是由malloc之類函數分配的空間所在地。地址是由低向高增加的,引用類型儲存在這。
stack:是自動分配變量,以及函數調用的時候所使用的一些空間。地址是由高向低減小的,值類型存儲在這。
52.GC是什麼,爲何要有GC?

答案;垃圾回收器,若是沒有GC,那麼一個系統隨着運行時間的增加,佔用內存會愈來愈大,若是咱們沒有主動釋放的話。

53。值類型和引用類型的區別。

答案:

1.    值類型的數據存儲在內存的棧中;引用類型的數據存儲在內存的堆中,而內存單元中只存放堆中對象的
地址。

2.     值類型存取速度快,引用類型存取速度慢。

3.     值類型表示實際數據,引用類型表示指向存儲在內存堆中的數據的指針或引用

4.     值類型繼承自System.ValueType,引用類型繼承自System.Object

5.     棧的內存分配是自動釋放;而堆在.NET中會有GC來釋放      

6.      值類型的變量直接存放實際的數據,而引用類型的變量存放的則是數據的地址,即對象的引用。
7. 值類型變量直接把變量的值保存在堆棧中,引用類型的變量把實際數據的地址保存在堆棧中,而實際數據則保存在堆中。

54.C#中的接口和類有什麼異同。

不一樣點:

不能直接實例化接口。

接口不包含方法的實現。

接口能夠多繼承,類只能單繼承。

類定義能夠在不一樣的源文件之間進行拆分。

相同點:

接口、類和結構均可以從多個接口繼承。

接口相似於抽象基類:繼承接口的任何非抽象類型都必須實現接口的全部成員。

接口和類均可以包含事件、索引器、屬性。

54.try{}裏有一個return語句,那麼緊跟在這個try後面的finally{}裏的code會不會被執行。何時執行?

答案;會,在return 以前執行。

55.描述線程與進程的區別。

1.進程有本身獨立的地址空間;而線程共享進程的地址空間;
2.一個程序至少有一個進程,一個進程至少有一個線程;

3.線程是處理器調度的基本單位,但進程不是;

4.兩者都可併發執行

56.什麼是反射?

答案:動態獲取程序集信息,動態獲取類的屬性和方法。

57.什麼是匿名方法?請寫一段代碼。

delegate(int i) { return i > 0; }

58.寫出幾種工做流產品或框架,並簡要的對比他們的差別。

59.寫出你所瞭解的設計模式,說一說使用設計模式帶來的好處,並嘗試用代碼寫出一個例子。

60.接受一個數組,找出兩個數的索引,這兩個數組相加之和等於指定的數字。找出一組便可,同一元素不可以使用兩次。

好比:nums=[2,7,11,15],目標數字是9,由於nums【0】+nums【1】=9,因此返回【0,1】

答案:最簡單的方法是使用兩個for循環,此種方法不給出代碼了,下面是第二種算法,須要先進行排序,排序算法略。

 1 int[] getindex(int n)
 2 {
 3 int i=0,j=nums.length-1
 4 while(i>j)
 5 {
 6     if(nums[i]+nums[j]==n)break;
 7     else if(nums[i]+nums[j]>n)j--;
 8     else i++;
 9 }
10 int[] a=new int[]{i,j}
11 return a;
12 }

61.

SELECT * FROM 表 /*數據源*/
AS P
PIVOT 
(
    SUM(Amount/*行轉列後 列的值*/) FOR 
    p.Month/*須要行轉列的列*/ IN (1,2,3,4/*列的值*/)
) AS T

附註:列轉行語句。測試語句

 1 CREATE TABLE ProgrectDetail
 2 (
 3     ProgrectName         NVARCHAR(20), --工程名稱
 4     OverseaSupply        INT,          --海外供應商供給數量
 5     NativeSupply         INT,          --國內供應商供給數量
 6     SouthSupply          INT,          --南方供應商供給數量
 7     NorthSupply          INT           --北方供應商供給數量
 8 )
 9 
10 INSERT INTO ProgrectDetail
11 SELECT 'A', 100, 200, 50, 50
12 UNION ALL
13 SELECT 'B', 200, 300, 150, 150
14 UNION ALL
15 SELECT 'C', 159, 400, 20, 320
16 UNION ALL

 1 SELECT P.ProgrectName,P.Supplier,P.SupplyNum
 2 FROM 
 3 (
 4     SELECT ProgrectName, OverseaSupply, NativeSupply,
 5            SouthSupply, NorthSupply
 6      FROM ProgrectDetail
 7 )T
 8 UNPIVOT 
 9 (
10     SupplyNum FOR Supplier IN
11     (OverseaSupply, NativeSupply, SouthSupply, NorthSupply )
12 ) P

執行結果:

 

 62.描述new有兩種用法

第一種:new Class():建立對象

第二種:覆蓋方法

public new XXXX(){}

63.傳入某個屬性的set方法的隱含參數的名稱是什麼?

value,它的類型和屬性所聲名的類型相同。

64.下面的代碼中有什麼錯誤嗎?_______

 1 using System;
 2 class A
 3 {
 4 public virtual void F(){
 5 Console.WriteLine("A.F");
 6 }
 7 }
 8 abstract class B:A
 9 {
10 public abstract override void F();
11 
12 //答:abstract override 是不能夠一塊兒修飾. 
13 } // new public abstract void F();

65.net的錯誤處理機制是什麼?
答:.net錯誤處理機制採用try->catch->finally結構,發生錯誤時,層層上拋,直到找到匹配的Catch爲止。

66.如何在C#中實現繼承?也就是繼承的格式

在類名後加上一個冒號,再加上基類的名稱。

67.描述一下C#中索引器的實現過程,是否只能根據數字進行索引?
答:不是。能夠用任意類型.http://www.javashuo.com/article/p-baoxdbks-cs.html

68.私有成員會被繼承麼?

會,可是不能被訪問。因此看上去他們彷佛是不能被繼承的,但實際上確實被繼承了.

69.C#中全部對象共同的基類是什麼?

System.Object

70.在方法定義中,virtual有什麼含意?

被virtual修飾的方法能夠被子類覆寫.

71.可以將非靜態的方法覆寫成靜態方法麼?

不能,覆寫方法的簽名必須與被覆寫方法的簽名保持一致,除了將virtual改成override

72.能夠覆寫私有的虛方法麼?

不能夠,甚至子類中沒法訪問父類中的私有方法

73.什麼是抽象類(abstract class)?

一種不能夠被實例化的類。抽象類中通常含有抽象方法,固然也可有具體實現。繼承類只有實現過全部抽象類的抽象方法後才能被實例化.

74.接口(interface)是什麼?

只含有公有抽象方法(public abstract method)的類。這些方法必須在子類中被實現.

75.接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?
答:接口能夠繼承接口。抽象類能夠實現(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。

76.構造器Constructor是否可被override?
答:構造器Constructor不能被繼承,所以不能重寫Overriding,但能夠被重載Overloading。

77.是否能夠繼承String類?
答:String類是final類故不能夠繼承.

78.數組有沒有length()這個方法? String有沒有length()這個方法?
答:數組沒有length()這個方法,有length的屬性。String有length()這個方法(查網上資料說有個方法,但我的實驗了一下是沒有的,只有Length屬性).

79.成員變量和成員函數前加static的做用?
答:它們被稱爲常成員變量和常成員函數,又稱爲類成員變量和類成員函數。分別用來反映類的狀態。好比類成員變量能夠用來統計類實例的數量,類成員函數負責這種統計的動做。

80.c#中using和new這兩個關鍵字有什麼意義,請寫出你所知道的意義?using 指令 和語句 new 建立實例 new 隱藏基類中方法。
答:using 引入名稱空間或者使用非託管資源
new 新建實例或者隱藏父類方法

81.什麼是虛函數?什麼是抽象函數?
答:虛函數:沒有實現的,可由子類繼承並重寫的函數。抽象函數:規定其非虛子類必須實現的函數,必須被重寫。

82.c#中的三元運算符是?
答:?:

83.public static const int A=1;這段代碼有錯誤麼?是什麼?
答:const不能用static修飾。

84.Ref參數是引用調用,out參數是輸入調用。

85.constreadonly有什麼區別?

const能夠用於局部常量,而readonly實際是類的initonly字段,顯然不能是局部的,const是編譯時常量,readonly是運行時常量。

86.虛函數的用法:

答:1)virtual指明一成員函數爲虛函數,而virtual僅用於類的定義裏,在類外可不加此關鍵字. 

2)一個類的成員函數被定義爲虛函數時,子類該函數仍保持虛函數特徵.
3)子類覆蓋此函數時,定義裏可不加virtual關鍵字,但函數聲明要和基類的徹底一致!且此聲明是必須的.
4)不是純虛函數時,父類的虛函數必需要實現; 而若將父類的虛函數設定爲純虛函數時,子類必須要覆蓋之並且必需要實現之!

87.解釋virtualsealedoverrideabstract的區別

virtual申明虛方法的關鍵字,說明該方法能夠被重寫

sealed說明該類不可被繼承

override重寫基類的方法

abstract申明抽象類和抽象方法的關鍵字,抽象方法不提供實現,由子類實現,抽象類不可實例化

88.對象和類的區別是什麼?

答:「類」(Class)具備相同屬性和方法的一組對象的集合. 類是抽象的概念,僅僅是模板

對象是一個你可以看獲得、摸得着的具體實體。

89.什麼是局部變量,什麼是成員變量?

答:局部變量是指一個方法中定義的變量;成員變量是指在類範圍裏定義的變量,也就是以前講過的屬性。

90.靜態成員和實例成員的區別?

答:使用static修飾的成員稱爲靜態成員,使用實例對象調用的成員稱爲實例成員

 

91.概述序列化

答: 序列化是將對象的狀態存儲到特定存儲介質中的過程。

反序列化則是從特定存儲介質中的數據從新構建對象的過程

 92.對象可否調用靜態方法 ?

答:不能。對於類內部定義的靜態變量及靜態方法,該類的對象均不能調用。

93爲何不能指定接口中方法的修飾符?

答:接口中的方法用來定義對象之間通訊的契約,指定接口中的方法爲私有或保護沒有意義。他們默認爲公有方法。

94.請詳述在.net中類(class)與結構(struct)的異同:

答:Class能夠被實例化,屬於引用類型,是分配在內存的堆上的,Struct屬於值類型,是分配在內存的棧上的

95.接口和抽象類具備什麼區別?

答:含有abstract修飾符的class即爲抽象類,abstract 類不能建立的實例對象。含有abstract方法的類必須定義爲abstract class,abstract class類中的方法沒必要是抽象的。abstract class類中定義抽象方法必須在具體子類中實現,因此,不能有抽象構造方法或抽象靜態方法。若是的子類沒有實現抽象父類中的全部抽象方法,那麼子類也必須定義爲abstract類型。

接口(interface)能夠說成是抽象類的一種特例,接口中的全部方法都必須是抽象的。接口中的方法定義默認爲public abstract類型

下面比較一下二者的語法區別:

1. 抽象類能夠有構造方法,接口中不能有構造方法。

2. 抽象類中能夠包含非抽象的普通方法,接口中的全部方法必須都是抽象的,不能有非抽象的普通方法。

3. 抽象類中抽象方法能夠指定爲public,接口中抽象方法不能指定任何修飾符,默認就是public

4. 一個類能夠實現多個接口,但只能繼承一個抽象類。

96.base關鍵字的做用是什麼?

答:子類繼承父類的過程當中,可能須要在子類中調用父類中的成員,如屬性、方法或者構造方法。這個時候,可使用base關鍵字來完成。base的做用是用於引用父類的成員,如屬性、方法或者是構造方法

97.什麼是抽象類?

答:抽象類不能建立實例,它只能做爲父類被繼承。抽象類是從多個具體類中抽象出來的父類,它具備更高層次的抽象。從多個具備相同特徵的類中抽象出一個抽象類,以這個抽象類做爲其子類的模板,從而避免了子類的隨意性。

98.接口和抽象類二者在應用上的區別:

答:接口更多的是在系統架構設計方法發揮做用,主要用於定義模塊之間的通訊契約。而抽象類在代碼實現方面發揮做用,能夠實現代碼的重用

99.面向對象的特徵有哪些方面?

答:面向對象的編程語言有封裝、繼承 、抽象、多態等4個主要的特徵。

封裝:

封裝的目標就是要實現軟件部件的「高內聚、低耦合」,防止程序相互依賴性而帶來的變更影響。

抽象:

抽象就是找出一些事物的類似和共性之處,而後將這些事物歸爲一個類

繼承:

子類繼承父類成員,實現代碼複用,提升了軟件的可重用性和可擴展性。

多態:

不一樣子類對同一個消息做出不一樣的反映,提升軟件靈活性

100.在C#中,string str=null string str= string.Empty與string str=「」請儘可能使用文字或圖象說明其中的區別。

答: string.Empty:不分配存儲空間。"":分配一個長度爲空的存儲空間,""和String.Empty,這兩個都是表示空字符串,空字符串是一個特殊的字符串,只不過這個字符串的值爲空,在內存中是有準確的指向的。

101.Params是什麼含義?

答:Params是C#中的關鍵字,採用此關鍵字能夠指定參數數目爲可變;在方法聲明中的params關鍵字以後不容許任何其餘參數,而且在方法聲明中只容許一個params關鍵字。

102.float f=-123.567F; int i=(int)f;i的值如今是_____? 答:-123

103.C#中 property(屬性) 與 attribute(特性)的區別,他們各有什麼用處,這種機制的好處在哪裏?

答:屬性:用於存取類的字段。特性:用來標識類,方法等的附加性質。

attribute:自定義屬性的基類;property :類中的屬性。

104.

相關文章
相關標籤/搜索