高級面試題

1、對於 Web 性能優化,您有哪些瞭解和經驗嗎?javascript

出現指數:五顆星css

主要考點:這道題是博主在博客園的新聞裏面看到的,回想以前幾年的面試經歷,發現此題出現機率仍是比較高的。由於它的考麪灰常廣,可讓面試官很快了解你的技術涉及面以及這些技術面的深度。html

參考答案:這個問題能夠分前端和後端來講。前端

一、前端優化java

(1)減小 HTTP 請求的次數。咱們知道每次發送http請求,創建鏈接和等待相應會花去至關一部分時間,因此在發送http請求的時候,儘可能減小請求的次數,一次請求能取出的數據就不要分屢次發送。jquery

(2)啓用瀏覽器緩存,當肯定請求的數據不會發生變化時,可以直接讀瀏覽器緩存的就不要向服務端發送請求。好比咱們ajax裏面有一個參數可以設置請求的時候是否啓用緩存,這種狀況下就須要咱們在發送請求的時候作好相應的緩存處理。程序員

(3)css文件放 在<head>裏面,js文件儘可能放在頁面的底部。由於請求js文件是很花費時間,若是放在<head>裏面,就會致使頁面的 DOM樹呈現須要等待js文件加載完成。這也就是爲何不少網站的源碼裏面看到引用的文件放在最後的緣由。web

(4)使用壓縮的css和js文件。這個不用多說,網絡流量小。面試

(5)若是條件容許,儘可能使用CDN的方式引用文件,這樣就能減小網絡流量。好比咱們經常使用的網站http://www.bootcdn.cn/ajax

(6)在寫js和css的語法時,儘可能避免重複的css,儘可能減小js裏面循環的次數,諸如此類。

二、後端優化:

(1)程序的優化:這是一個很大的話題,我這裏就選幾個常見的。好比減小代碼的層級結構、避免循環嵌套、避免循環CURD數據庫、優化算法等等。

(2)數據庫的優化:(因爲數據庫優化不是本題重點,因此可選幾個主要的來講)好比啓用數據庫緩存、經常使用的字段建索引、儘可能避免大事務操做、避免select * 的寫法、儘可能不用in和not in 這種耗性能的用法等等。

(3)服務器優化:(這個可做爲可選項)負載均衡、Web服務器和數據庫分離、UI和Service分離等等。

2、MVC路由理解?(家常便飯)

出現指數:五顆星

主要考點:此題主要考點是MVC路由的理解。

參考答案:

一、首先咱們要理解MVC中路由的做用:url Routing的做用是將瀏覽器的URL請求映射到特定的MVC控制器動做。

二、當咱們訪問http://localhost:8080/Home/Index 這個地址的時候,請求首先被UrlRoutingModule截獲,截獲請求後,從Routes中獲得與當前請求URL相符合的RouteData對象, 將RouteData對象和當前URL封裝成一個RequestContext對象,而後從Requestcontext封裝的RouteData中獲得 Controller名字,根據Controller的名字,經過反射建立控制器對象,這個時候控制器才真正被激活,最後去執行控制器裏面對應的 action。

3、談談你以爲作的不錯系統,大概介紹下用到了哪些技術?

出現指數:五顆星

主要考點:這是一道很是開放的面試題。博主遇到過好幾家公司的面試官都問道了這個,博主以爲他們是想經過這個問題快速瞭解面試者的技術水平。此題只要結合你最近項目用到的技術談談就行了。

參考答案:

就拿我以前作過的一個項目爲例來簡單說明一下吧。項目分爲客戶端和服務端,客戶端分 爲BS客戶端和CS客戶端,BS客戶端採用MVC 5.0的框架,CS客戶端是Winform項目,服務端使用WebApi統一提供服務接口,考慮之後可能還要擴展手機端,因此服務接口的參數和返回值使用 通用的Json格式來傳遞數據。

一、服務端採用的面向接口編程,咱們在軟件架構的過程當中,層和層之間經過接口依賴, 下層不是直接給上層提供實現,而是提供接口,具體的實現以依賴注入的方式在運行的時候動態注入進去。MEF就是實現依賴注入的一種組件。它的使用使得UI 層不直接依賴於BLL層,而是依賴於中間的一個IBLL層,在程序運行的時候,經過MEF動態將BLL裏面的實現注入到UI層裏面去,這樣作的好處是減小 了層與層之間的耦合。服務端的異常裏面、權限驗證、日誌記錄等通用功能使用了AOP攔截的機制統一管理,項目中使用的是Postsharp這個組件,很好 地將通用需求功能從不相關的類當中分離出來,提升了代碼的可維護性。

二、BS的客戶端採用的jquery+bootstrap 的方式,全部頁面採用流式佈局,能更好適應各類不一樣的終端設備(PC、手機)。項目中使用了各類功能強大的bootstrap組件,能適應各類複雜的業務需求。

4、Js繼承實現。

出現指數:五顆星

主要考點:這道題考驗面試者對js理解的深度。根據博主的經歷,這種題通常在筆試出現的概率較大,爲何把它放在這裏,由於它確實太常見了。其實js實現繼承的方式不少,咱們只要寫好其中一種就行了。

參考答案:原型鏈繼承

  1. function Person(name, age){ 
  2.     this.name = name; 
  3.     this.age = age; 
  4. }    
  5. //經過原型鏈給Person添加一個方法 
  6. Person.prototype.getInfo = function(){ 
  7.     console.log(this.name + " is " + this.age + " years old!"); } function Teacher(staffId){ this.staffId = staffId; } //經過prototype生命Teacher繼承Person Teacher.prototype = new Person(); var will = new Teacher(1000); will.name = "Will"; will.age = 28; 
  8. will.getInfo(); 

5、談談你對設計模式的認識?結合你用得最多的一種設計模式說說它的使用。

出現指數:五顆星

主要考點:不用多說,這題考的就是對設計模式的理解。通常爲了簡單可能會要求你寫一個單例模式,注意最好是寫一個完整點的,考慮線程安全的那種。而後會讓你說說你在項目中什麼狀況下會用到這種模式

參考答案:

通用寫法

  1. public class Singleton 
  2.  { 
  3.      // 定義一個靜態變量來保存類的實例 
  4.      private static Singleton uniqueInstance; 
  5.  
  6.      // 定義一個標識確保線程同步 
  7.      private static readonly object locker = new object(); 
  8.  
  9.      // 定義私有構造函數,使外界不能建立該類實例 
  10.      private Singleton() 
  11.      { 
  12.      } 
  13.  
  14.      /// <summary> 
  15.      /// 定義公有方法提供一個全局訪問點,同時你也能夠定義公有屬性來提供全局訪問點 
  16.      /// </summary> 
  17.      /// <returns></returns> 
  18.      public static Singleton GetInstance() 
  19.      {// 雙重鎖定只須要一句判斷就能夠了 
  20.          if (uniqueInstance == null) 
  21.          { 
  22.              lock (locker) 
  23.              { 
  24.                  // 若是類的實例不存在則建立,不然直接返回 
  25.                  if (uniqueInstance == null) 
  26.                  { 
  27.                      uniqueInstance = new Singleton(); 
  28.                  } 
  29.              } 
  30.          } 
  31.          return uniqueInstance; 
  32.      } 
  33.  } 

單例模式確保一個類只有一個實例,並提供一個全局訪問點,它的使用場景好比任務管理 器整個系統中應該只有一個把,再好比操做文件的對象,同一時間咱們只能有一個對象去操做文件吧。最重要的,好比咱們項目中用得很是多的功能→日誌記錄,在 一個線程中,記錄日誌的對象應該也只能有一個吧。單例模式的目的是爲了保證程序的安全性和數據的惟一性。或者你也能夠結合你使用的其餘設計模式來講明。

6、IIS的工做原理?

出現指數:四顆星

主要考點:此題主要考的是.net framework和IIS是如何結合呈現頁面的。這是一個有點複雜的過程,面試的時候不可能說得完整,那麼咱們就抓住幾個關鍵點說說就能夠。其實博主也不能徹底理解這個過程,今天正好借這個機會溫習下。

參考答案:

一、當客戶端發送HTTP Request時,服務端的HTTP.sys(能夠理解爲IIS的一個監聽組件) 攔截到這個請求;

二、HTTP.sys 聯繫 WAS 向配置存儲中心請求配置信息。

三、而後將請求傳入IIS的應用程序池。

四、檢查請求的後綴,啓動aspnet_isapi.dll這個dll,這個dll是.net framework裏面的,也就是說到這一步,請求進入了.net framework的管轄範圍。

五、這個時候若是是WebForm,開始執行復雜的頁面生命週期(HttpRuntime→ProcessRequest→HttpContext→HttpHandler);若是是MVC,則啓動mvc的路由機制,根據路由規則爲URL來指定HttpHandler。

六、httpHandler處理請求後,請求結束,給出Response,客戶端處理響應,整個過程結束。

7、Http協議

出現指數:四顆星

主要考點:此題主要考對於web裏面http協議的理解。

參考答案:

一、http協議是瀏覽器和服務器雙方共同遵循的規範,是一種基於TCP/IP應用層協議。

二、http是一種典型的請求/響應協議。客戶端發送請求,請求的內容以及參數存放到請求報文裏面,服務端收到請求後,作出響應,返回響應的結果放到響應報文裏面。經過F12能夠查看請求報文和響應報文。

三、http協議是」無狀態」的,當客戶端向服務端發送一次http請求後,服務端收到請求而後返回給客戶端相應的結果,服務器會當即斷開鏈接並釋放資源。在實際開發過程當中,咱們有時須要「保持」這種狀態,因此衍生出了Session/Cookie這些技術。

四、http請求的方式主要有get/post。

五、http狀態碼最好記幾個,博主有一次面試就被問到了。200(請求成功)、404(請求的資源不存在)、403(禁止訪問)、5xx(服務端錯誤)

8、數據庫優化經驗(後端工程師很是常見)

出現指數:四顆星

主要考點:此題考察後端工程師操做數據庫的經驗。說實話,數據庫是博主的弱項,博主以爲對於這種考題,須要抓住幾個經常使用而且關鍵的優化經驗,若是說得不對,歡迎你們斧正。

參考答案:

一、數據庫運維方面的優化:啓用數據庫緩存。對於一些比較經常使用的查詢能夠採用數據庫緩存的機制,部署的時候須要注意設置好緩存依賴項,防止「過時」數據的產生。

二、數據庫索引方面的優化:好比經常使用的字段建索引,聯合查詢考慮聯合索引。(PS:若是你有基礎,能夠敞開談談彙集索引和非彙集索引的使用場景和區別)

三、數據庫查詢方面的優化:避免select * 的寫法、儘可能不用in和not in 這種耗性能的用法等等。

四、數據庫算法方面的優化:儘可能避免大事務操做、減小循環算法,對於大數據量的操做,避免使用遊標的用法等等。

9、關於代碼優化你怎麼理解?你會考慮去代碼重構嗎?

出現指數:四顆星

主要考點:此題考的是面試者對代碼優化的理解,以及代碼如何重構的相關知識。

參考答案:

一、對於代碼優化,以前的公司每週會作代碼審覈,審覈的主要做用就是保證代碼的正確性和執行效率,好比減小代碼的層級結構、避免循環嵌套、避免循環CURD數據庫、儘可能避免一次取出大量數據放在內存中(容易內存溢出)、優化算法等。

二、對於陳舊代碼,可能不少地方有調用,而且開發和維護人員頗有可能不是同一我的,因此重構時要格外當心,若是沒有十足的把握,不要輕易重構。若是必需要重構,必須作好充分的單元測試和全局測試。

10、談談你的優勢和缺點?

出現指數:四顆星

主要考點:這道題讓人有一種罵人的衝動,可是沒辦法,恰恰不少所謂的大公司會問這個。好比華爲。這個問題見仁見智,答案能夠本身組織。

參考答案:

優勢:對於新的技術學習能力強,能很快適應新環境等等

缺點:對技術太過於執着等等

11、關於服務器端 MVC 架構的技術實現,您是怎樣理解的?這種架構方式有什麼好處?您在項目中是如何應用這一架構的?

出現指數:三顆星

主要考點:此題主要考的對於MVC這種框架的理解。

參考答案:MVC,顧名思義,Model、View、Controller。全部的 界面代碼放在View裏面,全部涉及和界面交互以及URL路由相關的邏輯都在Controller裏面,Model提供數據模型。MVC的架構方式會讓系 統的可維護性更高,使得每一部分更加專一本身的職責,而且MVC提供了強大的路由機制,方便了頁面切換和界面交互。而後能夠結合和WebForm的比較, 談談MVC如何解決複雜的控件樹生成、如何避免了複雜的頁面生命週期。

12、網站優化:網站運行慢,如何定位問題?發現問題如何解決?

出現指數:三顆星

主要考點:此題和問題一相似,考察Web的問題定位能力和優化方案。

參考答案:

瀏覽器F12→網絡→查看http請求數以及每一個請求的耗時,找到問題的根源,而後依次解決,解決方案能夠參考問題一里面的Web優化方案。

十3、說說你最擅長的技術?並說說你是如何使用的?

出現指數:三顆星

主要考點:這是一道很是開放的面試題。最初遇到這種問題,博主很想來一句:你妹,這叫什麼問題!但確實有面試官問到。回頭想一想,其實此題考查你擅長的技術的涉及深度。其實博主以爲對於這個問題,能夠結合你項目中用到的某一個技術來講就行了。

參考答案:

簡單談談MEF在咱們項目裏面的使用吧。

在談MEF以前,咱們必需要先談談DIP、IOC、DI

依賴倒置原則(DIP):一種軟件架構設計的原則(抽象概念)

控制反轉(IoC):一種反轉流、依賴和接口的方式(DIP的具體實現方式)。

依賴注入(DI):IoC的一種實現方式,用來反轉依賴(IoC的具體實現方式)。

什麼意思呢?也就是說,咱們在軟件架構的過程當中,層和層之間經過接口依賴,下層不是 直接給上層提供實現,而是提供接口,具體的實現以依賴注入的方式在運行的時候動態注入進去。MEF就是實現依賴注入的一種組件。它的使用使得UI層不直接 依賴於BLL層,而是依賴於中間的一個IBLL層,在程序運行的時候,經過MEF動態將BLL裏面的實現注入到UI層裏面去,這樣作的好處是減小了層與層 之間的耦合。這也正是面向接口編程方式的體現。

十4、本身寫過JS組件嗎?舉例說明。

出現指數:三顆星

主要考點:此題考的js組件封裝和js閉包的一些用法。通常來講,仍是筆試出現的概率較大。

參考答案:自定義html的select組件

  1. //combobox 
  2. (function ($) { 
  3.     $.fn.combobox = function (options, param) { 
  4.         if (typeof options == 'string') { 
  5.             return $.fn.combobox.methods[options](this, param); 
  6.         } 
  7.         options = $.extend({}, $.fn.combobox.defaults, options || {}); 
  8.         var target = $(this); 
  9.         target.attr('valuefield', options.valueField); 
  10.         target.attr('textfield', options.textField); 
  11.         target.empty(); 
  12.         var option = $('<option></option>'); 
  13.         option.attr('value', ''); 
  14.         option.text(options.placeholder); 
  15.         target.append(option); 
  16.         if (options.data) { 
  17.             init(target, options.data); 
  18.         } 
  19.         else { 
  20.             //var param = {}; 
  21.             options.onBeforeLoad.call(target, option.param); 
  22.             if (!options.url) return; 
  23.             $.getJSON(options.url, option.param, function (data) { 
  24.                 init(target, data); 
  25.             }); 
  26.         } 
  27.         function init(target, data) { 
  28.             $.each(data, function (i, item) { 
  29.                 var option = $('<option></option>'); 
  30.                 option.attr('value', item[options.valueField]); 
  31.                 option.text(item[options.textField]); 
  32.                 target.append(option); 
  33.             }); 
  34.             options.onLoadSuccess.call(target); 
  35.         } 
  36.         target.unbind("change"); target.on("change", function (e) { if (options.onChange) return options.onChange(target.val()); }); } $.fn.combobox.methods = { getValue: function (jq) { return jq.val(); }, setValue: function (jq, param) { jq.val(param); }, load: function (jq, url) { $.getJSON(url, function (data) { jq.empty(); var option = $('<option></option>'); option.attr('value', ''); option.text('請選擇'); jq.append(option); $.each(data, function (i, item) { var option = $('<option></option>'); option.attr('value', item[jq.attr('valuefield')]); option.text(item[jq.attr('textfield')]); jq.append(option); }); }); } }; $.fn.combobox.defaults = { url: null, param: null, data: null, valueField: 'value', textField: 'text', placeholder: '請選擇', onBeforeLoad: function (param) { }, onLoadSuccess: function () { }, onChange: function (value) { } 
  37.     }; 
  38. })(jQuery); 

 

調用的時候
  1. $("#sel_search_orderstatus").combobox({ 
  2.     url: '/apiaction/Order/OrderApi/GetOrderStatu', 
  3.     valueField: 'VALUE', 
  4.     textField: 'NAME' 
  5. }); 

就能自動從後臺取數據,注意valueField和textField對應要顯示和實際值。

十5、本身寫過多線程組件嗎?簡要說明!

出現指數:三顆星

主要考點:此題是兩年前博主在攜程的一次電話面試中遇到的,其餘地方基本上沒遇到過,其實到如今也不能理解當時面試官問這個問題的目的。但我想,此問題必有出處,估計面試官是想了解你對多線程以及線程池等的理解深度。

參考答案:能夠參考http://www.cnblogs.com/Alexander-Lee/archive/2009/10/31/1593647.html

 

一.填空題
1.面向對象的語言具備(繼承)性、(多態)性、(封裝)性。

2.能用foreach遍歷訪問的對象須要實現 (IEnumberable)接口或聲明(GetEnumberator)方法的類型。

3.列舉ADO.net中的五個主要對象(Command)、(Connection)、(DataReader)、(DataSet)、(DataAdapter)。

4.C#中的三元運算符是__(?:)__

5.當整數a賦值給一個object對象時,整數a將會被__(裝箱)___

6.類成員有__(3)__種可訪問形式

7.float f=-123.567F;int i=(int)f;i的值如今是_(-123)__

8.委託聲明的關鍵字是___( delegate) _

9.在Asp.net中全部的自定義用戶控件都必須繼承自_ (System.Web.UI.UserControl) __

10.在.Net中全部可序列化的類都被標記爲__[serializable]___

11.在.Net託管代碼中咱們不用擔憂內存漏洞,這是由於有了_ GC __

12.當類T只聲明瞭私有實例構造函數時,則在T的程序文本外部,_不能夠_(能夠 or 不能夠)從T派生出新的類,_不能夠_(能夠 or 不能夠)直接建立T的任何實例。

二.選擇題
1.如下敘述正確的是: BC
A. 接口中能夠有虛方法。 B. 一個類能夠實現多個接口。 
C. 接口不能被實例化。   D. 接口中能夠包含已實現的方法。

2.從數據庫讀取記錄,你可能用到的方法有: BCD 
A. ExecuteNonQuery     B. ExecuteScalar 
C. Fill                 D. ExecuteReader

3.對於一個實現了IDisposable接口的類,如下哪些項能夠執行與釋放或重置非託管資
相關的應用程序定義的任務?(多選)   (   ABC    )
A.Close    B.Dispose   C.Finalize   D.using  E.Quit

4.如下關於ref和out的描述哪些項是正確的?(多選)   (    ACD   )
    A.使用ref參數,傳遞到ref參數的參數必須最早初始化。  
    B.使用out參數,傳遞到out參數的參數必須最早初始化。   
    C.使用ref參數,必須將參數做爲ref參數顯式傳遞到方法。  
    D.使用out參數,必須將參數做爲out參數顯式傳遞到方法。

5.在對SQL Server 數據庫操做時應選用(A)
   A.SQL Server .NET Framework 數據提供程序;
B.OLE DB .NET Framework 數據提供程序;
C.ODBC .NET Framework 數據提供程序;
D.Oracle .NET Framework數據提供程序;

6.下列選項中,(C)是引用類型。
   A.enum類型   B.struct類型 C.string類型   D.int類型

7.關於ASP.NET中的代碼隱藏文件的描述正確的是(C)
   A.Web窗體頁的程序的邏輯由代碼組成,這些代碼的建立用於與窗體交互。編程邏輯惟一與用戶界面不一樣的文件中。該文件稱做爲「代碼隱藏」文件,若是用C#建立,該文件將具備「.ascx.cs」擴展名。
B.項目中全部Web窗體頁的代碼隱藏文件都被編譯成.EXE文件。
C.項目中全部的Web窗體頁的代碼隱藏文件都被編譯成項目動態連接庫(.dll)文件。
D.以上都不正確。

8.如下描述錯誤的是(A)
A.在C++中支持抽象類而在C#中不支持抽象類。
B.C++中可在頭文件中聲明類的成員而在CPP文件中定義類的成員,在C#中沒有頭文件而且在同一處聲明和定義類的成員。
C.在C#中可以使用 new 修飾符顯式隱藏從基類繼承的成員。
D.在C#中要在派生類中從新定義基類的虛函數必須在前面加Override。

9.C#的數據類型有(B)
   A.值類型和調用類型              B.值類型和引用類型
C.引用類型和關係類型            D.關係類型和調用類型

10.下列描述錯誤的是(D)
A.類不能夠多重繼承而接口能夠
B.抽象類自身能夠定義成員而接口不能夠
C.抽象類和接口都不能被實例化
D.一個類能夠有多個基類和多個基接口
11.在DOM中,裝載一個XML文檔的方法(D)
    A.save方法   B.load方法 C.loadXML方法 D.send方法

12.下列關於構造函數的描述正確的是(C)
A.構造函數能夠聲明返回類型。
B.構造函數不能夠用private修飾
C.構造函數必須與類名相同
D.構造函數不能帶參數

13.如下是一些C#中的枚舉型的定義,其中錯誤的用法有(A)
A.public enum var1{ Mike = 100, Nike = 102, Jike }
B.public enum var1{ Mike = 100, Nike, Jike }
C.public enum var1{ Mike=-1 , Nike, Jike }
D.public enum var1{ Mike , Nike , Jike }

14.int[][] myArray3=new int[3][]{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}}; myArray3[2][2]的值是(D)
     A.9                  B.2             C.6              D.越界

15.接口是一種引用類型,在接口中能夠聲明(A),但不能夠聲明公有的域或私有的成員變量
A..方法、屬性、索引器和事件           B.方法、屬性信息、屬
C.索引器和字段                        D.事件和字段;

16.ASP.NET框架中,服務器控件是爲配合Web表單工做而專門設計的。服務器控件有兩種類型,它們是(A )
   A.HTML控件和Web控件         B.HTML控件和XML控件 
C.XML控件和Web控件          D.HTML控件和IIS控件

17.ASP.NET中,在Web窗體頁上註冊一個用戶控件,指定該控件的名稱爲」Mike」,正確的註冊指令爲( D)
A.<%@Register TagPrefix = 「Mike」 TagName = 「Space2」 Src = 「myX.ascx」%>
B.<%@Register TagPrefix = 「Space2」 TagName = 「Mike」 Src = 「myX.ascx」%>
C.<%@Register TagPrefix = 「SpaceX」 TagName = 「Space2」 Src = 「Mike」%>
D.以上皆非

18.在ADO.NET中,對於Command對象的ExecuteNonQuery()方法和ExecuteReader()方法,下面敘述錯誤的是(C)
   A.insert、update、delete等操做的Sql語句主要用ExecuteNonQuery()方法來執行;
B.ExecuteNonQuery()方法返回執行Sql語句所影響的行數。
C.Select操做的Sql語句只能由ExecuteReader()方法來執行;
D.ExecuteReader()方法返回一個DataReder對象;


19.下列ASP.NET語句(B)正確地建立了一個與SQL Server 2000數據庫的鏈接。
    A. SqlConnection con1 = new Connection(「Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB」);
B. SqlConnection con1 = new SqlConnection(「Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB」);
C. SqlConnection con1 = new SqlConnection(Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB);
D. SqlConnection con1 = new OleDbConnection(「Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB」);

20.Winform中,關於ToolBar控件的屬性和事件的描述不正確的是(D)
A.Buttons屬性表示ToolBar控件的全部工具欄按鈕
B.ButtonSize屬性表示ToolBar控件上的工具欄按鈕的大小,如高度和寬度
C.DropDownArrows屬性代表工具欄按鈕(該按鈕有一列值須要如下拉方式顯示)旁邊是否顯示下箭頭鍵
D.ButtonClick事件在用戶單擊工具欄任何地方時都會觸發

21.在ADO.NET中執行一個存儲過程時,若是要設置輸出參數則必須同時設置參數的方向和(D ),必要時還要設置參數尺寸。
   A.大小;           B.上限;              C.初始值;            D.類型

22.若是將窗體的FormBoderStyle設置爲None,則( A)。
A.窗體沒有邊框並不能調整大小;        B.窗體沒有邊框但能調整大小;
C.窗體有邊框但不能調整大小;          D.窗體是透明的;

23.若是要將窗體設置爲透明的,則( B)
    A.要將FormBoderStyle屬性設置爲None; B.要將Opacity屬性設置爲小於100%的值;
C.要將locked 屬性設置爲True;        D.要將 Enabled屬性設置爲True;

24.下列關於C#中索引器理解正確的是(B/C )
    A.索引器的參數必須是兩個或兩個以上   B.索引器的參數類型必須是整數型
C.索引器沒有名字                     D.以上皆非

25.下面描述錯誤的是( C/D)
    A.窗體也是控件; B.窗體也是類; C.控件是從窗體繼承來的;D.窗體的父類是控件類

26.要對註冊表進行操做則必須包含( D)
    A.System.ComponentModel命名空間;B.System.Collections命名空間;
C.System.Threading命名空間;     D.Microsoft.Win32命名空間;

27.要建立多文檔應用程序,須要將窗體的(D )屬性設爲true。
    A.DrawGrid;    B.ShowInTaskbar;     C.Enabled;     D.IsMdiContainer;


28.若是設treeView1=new TreeView(),則treeView1.Nodes.Add("根節點")返回的是一個 (A)類型的值。
   A.TreeNode;  B.int;  C.string;  D.TreeView;

29.下面關於XML的描述錯誤的是(D)
A.XML提供一種描述結構化數據的方法;
B.XML 是一種簡單、與平臺無關並被普遍採用的標準;
C.XML文檔可承載各類信息;
D.XML只是爲了生成結構化文檔;

30.裝箱、拆箱操做發生在: (  C  )
    A.類與對象之間           B.對象與對象之間
C.引用類型與值類型之間   D.引用類型與引用類型之間

31.用戶類若想支持Foreach語句須要實現的接口是: (  A  )
A.Ienumerable       B.Ienumerator    C.Icollection        D.IcollectData

32.Net Framework經過什麼與COM組件進行交互操做?(   C )
    A.Side By Side     B.Web Service    C.Interop     D.PInvoke

33..Net依靠如下哪一項技術解決COM存在的Dll Hell問題的?( A   )
    A.Side By Side     B.Interop    C.Pinvoke      D.COM+

34.裝箱與拆箱操做是不是互逆的操做?(  B  )
    A.是        B.否

35.如下哪一個是能夠變長的數組?(  D  )
A.Array        B.string[]       C.string[N]        D.ArrayList

36.用戶自定義異常類須要從如下哪一個類繼承:(  A  )
    A.Exception  B.CustomException   C.ApplicationException  D.BaseException

 

 

簡介

  • 這次包含的不止是.NET知識,也包含少量前端知識以及.net面試時所涉及的種種考點,但願能給找工做的同窗們哪怕一點點幫助。

在此提醒下,本文適合:

  • 剛畢業的萌新
  • 工做不久換工做的
  • 大牛可忽略啦

1.接口

文章引用:http://www.cnblogs.com/jiajiayuan/archive/2011/09/16/2178462.html

①.接口的特性:

  1. 接口相似於抽象基類,不能直接實例化接口;接口中的方法都是抽象方法,實現接口的任何非抽象類型都必須實現接口的全部成員:
  • 當顯式實現該接口的成員時,實現的成員不能經過類實例訪問,只能經過接口實例訪問。
  • 當隱式實現該接口的成員時,實現的成員能夠經過類實例訪問,也能夠經過接口實例訪問,可是實現的成員必須是公有的。
  1. 接口不能包含常量、字段、運算符、實例構造函數、析構函數或類型、不能包含靜態成員。
  2. 接口成員是自動公開的,且不能包含任何訪問修飾符。
  3. 接口自身可從多個接口繼承,類和結構可繼承多個接口,但接口不能繼承類。

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

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

interface IProgram { void Fun(); } class Program:IProgram { //顯式實現接口成員 void IProgram.Fun() { Console.WriteLine("I am Fun."); } staticvoid Main(string[] args) { IProgram p =new Program(); //聲明一個接口實例,但不是對接口進行實例化 p.Fun(); Console.Read(); } }

③實現接口能夠顯式實現和隱式實現,那麼這兩種實現到底有什麼優缺點呢?

通常狀況,當類或者結構要實現的是單個接口,能夠使用隱式實現。
若是類或者結構繼承了多個接口且接口中具備相同名稱成員時,就要用到顯式實現,當顯式實現方式存在時,隱式實現方式就失效了。

interface IProgram { void Fun(); } interface IAProgram { void Fun(); } class Program : IProgram, IAProgram { void IProgram.Fun() //顯式實現接口IProgram { Console.WriteLine("I am IProgram Fun."); } void IAProgram.Fun() //顯式實現接口IAProgram { Console.WriteLine("I am IAProgram Fun."); } //public void Fun() //隱式實現接口 //{ // Console.WriteLine("I am Program Fun."); //} staticvoid Main(string[] args) { //IProgram p = new Program(); //p.Fun(); //IAProgram ap = new Program(); //ap.Fun(); Program pro =new Program(); ((IProgram)pro).Fun(); ((IAProgram)pro).Fun(); Console.Read(); } }

④接口的繼承:

接口繼承和類繼承不一樣

  1. 首先,類繼承不只是說明繼承,並且也是實現繼承;而接口繼承只是說明繼承。
    也就是說,派生類能夠繼承基類的方法實現,而派生的接口只繼承了父接口的成員方法說明,而沒有繼承父接口的實現;
  2. 其次,C#中類繼承只容許單繼承,可是接口繼承容許多繼承,一個子接口能夠有多個父接口。
    接口能夠從零或多個接口中繼承。從多個接口中繼承時,用":"後跟被繼承的接口名字,多個接口名之間用","分割。
    被繼承的接口應該是能夠訪問獲得的,好比從private 類型或internal 類型的接口中繼承就是不容許的。
    接口不容許直接或間接地從自身繼承。和類的繼承類似,接口的繼承也造成接口之間的層次結構。
interface IProgram { void Fun(); } interface IAProgram:IProgram { } class Program : IAProgram { void IProgram.Fun() { Console.WriteLine("I am IProgram Fun."); } static void Main(string[] args) { Program pro =new Program(); ((IAProgram)pro).Fun(); Console.Read(); } }

⑤接口的覆蓋:

因爲接口的實現沒有方法體,抽象方法也沒有方法體,那麼當咱們在接口的實現方法裏調用抽象方法時,會如何執行呢?

interface IProgram { void Fun(); } abstract class AProgram : IProgram { public abstract void AFun(); void IProgram.Fun() { AFun(); } } class Program:AProgram { public override void AFun() { Console.WriteLine("I am AProgram."); } static void Main(string[] args) { IProgram pro =new Program(); pro.Fun(); Console.Read(); } } //結果:I am Aprogram.

經過斷點,能夠看到,當執行pro.Fun();時,首先會跳到接口的實現方法裏,而後去調用抽象函數的實現方法,當抽象函數的方法實現後,再回到接口的實現方法,直到執行完成

當咱們在實現接口的方法裏調用虛函數呢?

interface IProgram { void Fun(); } class AProgram : IProgram { public virtual void AFun() //注意這裏是虛函數 { Console.WriteLine("I am virtual AFun."); } void IProgram.Fun() { AFun(); } } class Program:AProgram { public override void AFun() //這裏是Override重寫 { Console.WriteLine("I am override AFun."); } static void Main(string[] args) { IProgram pro =new Program(); pro.Fun(); Console.Read(); } }

這時,咱們發現,執行的順序和上一個例子是相同的。因此結果爲:I am override AFun.
由此,咱們能夠繼續聯想,當咱們把override關鍵字,換成new呢?是否是也是一樣的結果,仍是和咱們之前講的例子同樣,是隱藏呢?

咱們把上面的例子進行改進:

interface IProgram { void Fun(); } class AProgram : IProgram { public virtual void AFun() { Console.WriteLine("I am virtual AFun."); } void IProgram.Fun() { AFun(); } } class Program:AProgram { public new void AFun() { Console.WriteLine("I am new AFun."); } static void Main(string[] args) { Program pro =new Program(); ((IProgram)pro).Fun(); pro.AFun(); Console.Read(); } } 

結果爲:

I am virtual AFun.
I am new AFun.

因爲前面已經講過了==,這裏不在對此進行分析,由此咱們可知使用New關鍵字是對其進行隱藏,當對接口實現的方法裏調用的是虛方法時,和類的執行過程是同樣的。

⑥接口和抽象類的區別

  1. 接口用於規範,抽象類用於共性。
  2. 接口中只能聲明方法,屬性,事件,索引器。而抽象類中能夠有方法的實現,也能夠定義非靜態的類變量。
  3. 抽象類是類,因此只能被單繼承,可是接口卻能夠一次實現多個。
  4. 抽象類能夠提供某些方法的部分實現,接口不能夠。
  5. 抽象類的實例是它的子類給出的。接口的實例是實現接口的類給出的。
  6. 在抽象類中加入一個方法,那麼它的子類就同時有了這個方法。而在接口中加入新的方法,那麼實現它的類就要從新編寫(這就是爲何說接口是一個類的規範了)。
  7. 接口成員被定義爲公共的,但抽象類的成員也能夠是私有的、受保護的、內部的或受保護的內部成員(其中受保護的內部成員只能在應用程序的代碼或派生類中訪問)。
  8. 此外接口不能包含字段、構造函數、析構函數、靜態成員或常量。

⑦C#中的接口和類有什麼異同

  1. 不能直接實例化接口。
  2. 接口不包含方法的實現。
  3. 接口能夠實現多繼承,而類只能是單繼承。
  4. 類定義可在不一樣的源文件之間進行拆分。

  1. 接口、類和結構可從多個接口繼承。
  2. 接口相似於抽象基類:繼承接口的任何非抽象類型都必須實現接口的全部成員。
  3. 接口能夠包含事件、索引器、方法和屬性。
  4. 一個類能夠實現多個接口。

2.您在什麼狀況下會用到虛方法或抽象類,接口?

  1. 若是某個方法可能性在派生類中會被重寫。這時就將該方法寫爲虛方法。
  2. 抽象類:是一個類型,與派生類之間的關係是一個「ISA」的關係。用來作基類,抽象類不能建立對象,類中包括抽象方法和實例方法。
  3. 接口:是設計一個規範,描述了Can do ;與實現類之間是中」LINE A 的關係,C#中接口不能包含字段訪問修飾符。

3.重載(Overload )和覆寫(Override)的區別

簡述:簡單的說,一個是同一個函數的幾種形式,一個是重寫父類函數。

重載:當類包含兩個名稱相同但簽名不一樣(方法名相同,參數列表不相同)的方法時發生方法重載。用方法重載來提供在語義上完成相同而功能不一樣的方法。

覆寫:在類的繼承中使用,經過覆寫子類方法能夠改變父類虛方法的實現。

區別:

  1. 方法的覆蓋是子類和父類之間的關係,是垂直關係;方法的重載是同一個類中方法之間的關係,是水平關係。
  2. 覆蓋只能由一個方法,或只能由一對方法產生關係;方法的重載是多個方法之間的關係。
  3. 覆蓋要求參數列表相同;重載要求參數列表不一樣。
  4. 覆蓋關係中,調用那個方法體,是根據對象的類型(對象對應存儲空間類型)來決定;重載關係,是根據調用時的實參表與形參表來選擇方法體的。

4.值類型和引用類型的區別?寫出C#的樣例代碼。

簡述:值類型包括簡單類型、結構體類型和枚舉類型,引用類型包括自定義類、數組、接口、委託等

  1. 賦值方式:將一個值類型變量賦給另外一個值類型變量時,將複製包含的值。這與引用類型變量的賦值不一樣,引用類型變量的賦值只複製對象的引用,而不復制對象自己。
  2. 派生:值類型不可能派生出新的類型,全部的值類型均隱式派生自 System.ValueType。但與引用類型相同的是,結構也能夠實現接口。
  3. null:與引用類型不一樣,值類型不可能包含 null 值。然而,可空類型功能容許將 null 賦給值類型。
  4. 每種值類型均有一個隱式的默認構造函數來初始化該類型的默認值。
    值類型主要由兩類組成:結構、枚舉

    ①. 結構分爲如下幾類:Numeric(數值)類型、整型、浮點型、decimal、bool、用戶定義的結構。

    ②. 引用類型的變量又稱爲對象,可存儲對實際數據的引用。聲明引用類型的關鍵字:class、interface、delegate、內置引用類型: object、string

  5. 值類型存貯在中,而引用類型存貯在動態的堆中,棧是先進先出的有系統管理的空間,而堆是由應用程序控制的可隨時申請和釋放該空間,在Donnet中通常狀況下有垃圾收集器處理,他們的不一樣致使在編程上的不一樣。
    例:

using System; using System.Text; class EventDel { static void Main(string[] args) { StringBuilder a=new StringBuilder();//將StringBuilder的一個首地址傳給a StringBuilder b=a; //將StringBuilder的一個首地址傳給b b.Append("mxh"); Console.WriteLine(a); a=null; Console.WriteLine(b); } }

"a=null"的意思是:a的引用置爲空但此時StringBuilder的堆空間並無被釋放,所以在此以後,輸出b時,仍然能夠輸出mxh

輸出結果:
mxh
mxh

5.委託和事件簡述

參考資料 :
C# 知識回顧 - 委託 delegate

C# 知識回顧 - 委託 delegate (續)

事件是否是一種委託?

委託是一種安全的函數指針,事件是一種消息機制

委託與事件是什麼關係?爲何要使用委託

委託提供了封裝方法的方式,事件是某動做已發生的說明,事件是創建於委託之上的。

程序運行時同一個委託可以用來調用不一樣的方法,只要改變它的引用方法便可,所以委託調節器用的方法不是在編譯時決定的,而是在運行時肯定的.

6.Session,ViewState,Application,cookie的區別?

  1. Session:用於保持狀態的基於 Web 服務器的方法。Session 容許經過將對象存儲在Web 服務器的內存中在整個用戶會話過程當中保持任何對象。主要用於保持代碼隱藏類中對象的狀態。爲每一個用戶建立的,用於存儲單個用戶,由於他是相對每一個用戶的.因此可能來取得在線人數等。
  2. ViewState:主要用於保持 Web 頁上控件的狀態。當 Web 頁上的控件被綁定到代碼隱藏類中的對象。
  3. Application 用於存儲全部用戶均可視的信息.因此它存儲的是要讓全部用戶共享的一些信息.如總訪問數等Cache,頁面緩存。
  4. Cookie:一般咱們都把它放在客戶端,也能夠存儲在服務器端。主要用它存儲用戶的個性設制,和登錄信息。

7.Application,Session,Cookie,ViewState和Cache生命週期

在ASP.NET中,有不少種保存信息的內置對象,如:Application,Session,Cookie,ViewState和Cache等。下面分別介紹它們的用法和區別。

①.Application對象

Application用於保存全部用戶的公共的數據信息,若是使用Application對象,一個須要考慮的問題是任何寫操做都要在Application_OnStart事件(global.asax)中完成.儘管使用Application.Lock和Applicaiton.Unlock方法來避免寫操做的同步,可是它串行化了對Application對象的請求,當網站訪問量大的時候會產生嚴重的性能瓶頸.所以最好不要用此對象保存大的數據集合. 下面咱們作個在線用戶統計的例子來講明這個問題:

Global.asax類
   代碼
using System; using System.Collections; using System.ComponentModel; using System.Web; using System.Web.SessionState; using System.IO; /// Global 的摘要說明。 public class Global : System.Web.HttpApplication { /// 必需的設計器變量。 private System.ComponentModel.IContainer components = null; private FileStream fileStream; private StreamReader reader;//讀字符流 private StreamWriter writer;//寫字符流 public Global() { InitializeComponent(); } protected void Application_Start(Object sender, EventArgs e) { Application["CurrentGuests"]=0;//初始花爲0; fileStream = File.Open(Server.MapPath("counts.text"),FileMode.OpenOrCreate);//文件不存在,建立文件 reader = new StreamReader(fileStream);//要讀取的完整路徑 Application["AllGuests"] = Convert.ToInt32(reader.ReadLine()); //從當前流中讀取一行字符並將數據做爲字符串返回 reader.Close();//關閉流 } protected void Session_Start(Object sender, EventArgs e)//當用戶訪問網站時,在線用戶+1,總訪問數+1 { Application.Lock();//同步,避免同時寫入 Application["CurrentGuests"] =(int)Application["CurrentGuests"]+ 1;//總在線用戶數 Application["AllGuests"] =(int)Application["AllGuests"]+ 1;//訪問網站的總用戶數 fileStream = new FileStream(Server.MapPath("counts.text"),FileMode.OpenOrCreate,FileAccess.ReadWrite);// writer = new StreamWriter(fileStream);//實現一個寫入流,使其以一種特定的編碼向流中寫入字符 writer.WriteLine(Application["AllGuests"].ToString());//把訪問網站的總用戶數再次寫入到文件 writer.Close();//關閉寫入流 Application.UnLock();//同步結束 } protected void Session_End(Object sender, EventArgs e)//當前用戶退出網站時,在線用戶數量-1, { Application.Lock(); Application["CurrentGuests"] =(int)Application["CurrentGuests"] - 1;//總在線用戶數量-1 Application.UnLock(); } (2) WebForm1.aspx private void Page_Load(object sender, System.EventArgs e) { this.Label1.Text = "正在訪問站點的用戶數:" + Application["CurrentGuests"].ToString(); this.Label2.Text ="訪問過站點的總用戶數:" + Application["AllGuests"].ToString(); }

②.Session對象

Session用於保存每一個用戶的專用信息.每一個客戶端用戶訪問時,服務器都爲每一個用戶分配一個惟一的會話ID(Session ID) . 她的生存期是用戶持續請求時間再加上一段時間(通常是20分鐘左右).Session中的信息保存在Web服務器內容中,保存的數據量可大可小.當Session超時或被關閉時將自動釋放保存的數據信息.因爲用戶中止使用應用程序後它仍然在內存中保持一段時間,所以使用Session對象使保存用戶數據的方法效率很低.對於小量的數據,使用Session對象保存仍是一個不錯的選擇.使用Session對象保存信息的代碼以下:

//存放信息 Session["key"]="value" //讀取數據 string UserName=Session["key"].ToString();

③.Cookie對象

Cookie用於保存客戶瀏覽器請求服務器頁面的請求信息,程序員也能夠用它存放非敏感性的用戶信息,信息保存的時間能夠根據須要設置.若是沒有設置Cookie失效日期,它們僅保存到關閉瀏覽器程序爲止.若是將Cookie對象的Expires屬性設置爲Minvalue,則表示Cookie永遠不會過時.Cookie存儲的數據量很受限制,大多數瀏覽器支持最大容量爲4K,所以不要用來保存數據集及其餘大量數據.因爲並不是全部的瀏覽器都支持Cookie,而且數據信息是以明文文本的形式保存在客戶端的計算機中,所以最好不要保存敏感的,未加密的數據,不然會影響網站的安全性.使用Cookie對象保存的代碼以下:

//存放信息 Response.Cookies["key"].Value="value"; //讀取信息 string UserID=Response.Cookies["key"].Value;

④.ViewState對象

ViewState 經常使用於保存單個用戶的狀態信息,有效期等於頁面的生存期。跟隱藏控件類似。viewstate是在本頁面以內各函數間進行傳值的 , 至於爲何要使用這種方法是由於在一個事件發生以後 , 頁面可能會刷新 , 若是定義全局變量會被清零 , 因此要使用viewstate. ViewState容器能夠保持大量的數據,可是必須謹慎使用,由於過多使用會影響應用程序的性能。全部Web服務器控件都使用ViewState在頁面回發期音保存本身的狀態信息。若是某個控件不須要在回發期間保存狀態信息,最好關閉該對象的ViewState,避免沒必要要的資源浪費。經過給@Page指令添加「EnableViewState=false」屬性能夠禁止整個頁面的ViewState。使用ViewState對象保存信息的代碼以下。

//存放信息 ViewState["key"]="value"; //讀取信息 string NameID=ViewState["nameID"].ToString();

⑤.Cache對象

Cache對象用於在HTTP請求間保存頁面或數據。該對象的使用能夠極大地提升整個應用程序的效率。經常使用於將頻繁訪問的大量服務器資源存儲在內存中,當用戶發出相同的請求後服務器再也不次處理而是將Cache中保存的信息返回給用戶,節省了服務器處理請求的時間。其生存期依賴於該應用程序的生存期。當從新啓動應用程序時,將從新建立其Cache對象的實例。使用Cache對象保存信息的代碼以下。

//存放信息
  Cache["nameID"]="0001"; //存放信息 Cache.Insert("nameID","0001"1); //讀取信息 string NameID=Cache["nameID"].ToString();

⑥.隱藏域

Hidden控件是屬於HTML類型的服務器控件,使用此控件能夠實現隱藏域的功能。其實此控件和其它服務器控件的使用沒有太大區別,只是它不會在用戶端的瀏覽器中顯示,始終處於隱藏狀態。可是每次頁面提交的時候,此控件和其它服務器控件一同提交到服務器端,所以在服務器端能夠使用Value屬性獲取或保存一些數據信息。使用Hidden控件保存信息的代碼以下。

//存放信息 Hidden.Value="0001"; //獲取信息 string NameID=Hidden.Value;

⑦.查詢字符串

查詢字符串的方式是將要傳遞的值鏈接在URL後面,而後經過Response.Redirect方法實現客戶端的重定向。這種方式能夠實如今兩個頁面之間傳遞信息。因爲URL的長度有必定的限制,所以不能傳遞太大的信息,加外安全性也不是很好。
傳遞信息以下。問號後面格式 key1=value1&key2=value2

Response.Redirect("List.aspx?nameID=0001&gradeID=002"); //執行上面的語句後在IE地址欄顯示的URL的代碼以下。 http://localhost/List.aspx?nameID=0001&grade=002 //當跳轉到List.aspx後,能夠經過如下代碼得到所傳遞的信息。 string NameID.GradeID;

8.ajax原理

簡述: Ajax的原理就是:經過javascript的方式,將前臺數據經過xmlhttp對象傳遞到後臺,後臺在接收到請求後,將須要的結果,再傳回到前臺,這樣就能夠實現不須要頁面的回發,頁是數據實現來回傳遞,從頁實現無刷新。

Ajax的原理簡單來講,實際上就是經過XmlHttpRequest對象來向服務器發異步請求,從服務器得到數據,而後用javascript來操做DOM而更新頁面。
這其中最關鍵的一步就是從服務器得到請求數據。要清楚這個過程和原理,咱們必須對 XMLHttpRequest有所瞭解。

總結:咱們能夠看出,XMLHttpRequest對象徹底用來向服務器發出一個請求的,它的做用也侷限於此,但它的做用是整個ajax實現的關鍵,咱們能夠把服務器端當作一個數據接口,它返回的是一個純文本流,固然,這個文本流能夠是XML格式,能夠是Html,能夠是Javascript代碼,也能夠只是一個字符串。這時候,XMLHttpRequest向服務器端請求這個頁面,服務器端將文本的結果寫入頁面,這和普通的web開發流程是同樣的,不一樣的是,客戶端在異步獲取這個結果後,不是直接顯示在頁面,而是先由javascript來處理,而後再顯示在頁面。

9.請敘述屬性與索引器的區別

屬性 索引器
經過名稱標識 經過簽名標識
經過簡單名稱或成員訪問來訪問 經過元素訪問來訪問
能夠爲靜態成員或實例成員 必須爲實例成員
屬性的get訪問器沒有參數 索引器的get訪問器具備與索引器相同的形參表
屬性的set訪問器包含隱式value參數器 除了value參數外,索引的 set 訪問器還具備與索引器相同的形參表

10.String類與StringBuilder類有什麼區別?爲啥在.Net類庫中要同時存在這2個類?

若是要操做一個不斷增加的字符串,儘可能不用String類,改用StringBuilder類

String類原理:String類是一種傳統的修改字符串的方式,它確實能夠完成把一個字符串添加到另外一個字符串上的工做沒錯,可是在.NET框架下,這個操做實在是划不來。由於系統先是把兩個字符串寫入內存,接着刪除原來的String對象,而後建立一個String對象,並讀取內存中的數據賦給該對象。這一來二去的,耗了很多時間。

StringBulider原理:而使用 System.Text命名空間下面的StringBuilder類就不是這樣了,它提供的Append方法,可以在已有對象的原地進行字符串的修改,簡單並且直接。

提醒:通常狀況下覺察不到這兩者效率的差別,但若是你要對某個字符串進行大量的添加操做,那麼StringBuilder類所耗費的時間和 String類簡直不是一個數量級的

11.淺談C#中的枚舉

枚舉類型是一種的值類型,它用於聲明一組命名的常數。

①.枚舉的聲明:枚舉聲明用於聲明新的枚舉類型。

訪問修辭符 enum 枚舉名:基礎類型 { 枚舉成員 }

基礎類型必須可以表示該枚舉中定義的全部枚舉數值。枚舉聲明能夠顯式地聲明 byte、sbyte、short、ushort、int、uint、long 或 ulong 類型做爲對應的基礎類型。沒有顯式地聲明基礎類型的枚舉聲明意味着所對應的基礎類型是 int。

②.枚舉成員

枚舉成員是該枚舉類型的命名常數。任意兩個枚舉成員不能具備相同的名稱。每一個枚舉成員均具備相關聯的常數值。此值的類型就是枚舉的基礎類型。每一個枚舉成員的常數值必須在該枚舉的基礎類型的範圍以內。

public enum TimeofDay:uint { Morning=-3, Afternoon=-2, Evening=-1 } 

產生編譯時錯誤,緣由是常數值 -一、-2 和 –3 不在基礎整型 uint 的範圍內。

③.枚舉成員默認值

在枚舉類型中聲明的第一個枚舉成員它的默值爲零。
之後的枚舉成員值是將前一個枚舉成員(按照文本順序)的值加 1 獲得的。這樣增長後的值必須在該基礎類型可表示的值的範圍內;不然,會出現編譯時錯誤。

示例:
        public enum TimeofDay:uint { Morning, Afternoon, Evening } 

Morning的值爲0,Afternoon的值爲1,Evening的值爲2。

④.爲枚舉成員顯示賦值

容許多個枚舉成員有相同的值。沒有顯示賦值的枚舉成員的值,老是前一個枚舉成員的值+1

public enum Number { a=1, b, c=1, d }

b的值爲2,d的值爲2.
注意:以上枚舉值都不能超過它的基礎類型範圍。不然會報錯.

⑤.枚舉類型與基礎類型的轉換

基礎類型不能隱式轉換爲枚舉類型; 枚舉類型也不能隱式轉換爲基礎類型

public enum Number { a, b, c, d } class Test { public static void Main() { int i=Number.a;//錯誤,要強制類型轉換(int)Number.a Number n; n=2 //錯誤,要強制類型轉換(Number)2 } }

⑥.System.Enum類型

  1. System.Enum 類型是全部枚舉類型的抽象基類,而且從 System.Enum 繼承的成員在任何枚舉類型中均可用。
  2. System.Enum 自己不是枚舉類型。相反,它是一個類類型,全部枚舉類型都是從它派生的。
  3. System.Enum 從類型 System.ValueType派生

⑦.使用枚舉類型

using System;
        public enum TimeofDay { Morning, Afternoon, Evening } class Test { static void WriteGreeting(TimeofDay timeofDay) { switch(timeofDay) { case TimeofDay.Morning: Console.WriteLine("good morning"); break; case TimeofDay.Afternoon: Console.WriteLine("good afternoon"); break; case TimeofDay.Evening: Console.WriteLine("good evening"); break; } } static void Main() { WriteGreeting(TimeofDay.Morning); WriteGreeting(TimeofDay.Evening); WriteGreeting(TimeofDay.Afternoon); } } 

12.C#的New關鍵字的幾種用法

①.new運算符:用於建立對象和調用構造函數。

  • 用於建立對象和調用構造函數 例:Class_Test MyClass=new Class_Test();
  • 也用於爲值類型調用默認的構造函數
例:int myInt=new int();

myInt初始化爲0,它是int類型的默認值。該語句的效果等同於:intmyInt=0;

  • 不能重載new運算符;
  • 若是new運算符分配內存失敗,則它將引起OutOfMemoryException異常。

②.new修飾符

使用new修飾符顯式隱藏從基類繼承的成員。若要隱藏繼承的成員,請使用相同名稱在派生類中聲明該成員,並用new修飾符修飾它。

請看下面的類:

public class MyClass { public int x; public void Invoke(){} }

在派生類中用Invoke名稱聲明成員會隱藏基類中的Invoke方法,即:

public class MyDerivedC:MyClass { new public void Invoke(){} }

可是,由於字段x不是經過相似名隱藏的,因此不會影響該字段。

經過繼承隱藏名稱採用下列形式之一:

1.引入類或結構中的常數、指定、屬性或類型隱藏具備相同名稱的全部基類成員。

2.引入類或結構中的方法隱藏基類中具備相同名稱的屬性、字段和類型。同時也隱藏具備相同簽名的全部基類方法。

3.引入類或結構中的索引器將隱藏具備相同名稱的全部基類索引器。

4.在同一成員上同時使用new和override是錯誤的。

注意:在不隱藏繼承成員的聲明中使用new修飾符將生成警告。

示例:在該例中,嵌套類MyClass隱藏了基類中具備相同名稱的類。該例不只說明了如何使用徹底限定名訪問隱藏類成員,同時也說明了如何使用new修飾符消除警告消息。

using System; public class MyBaseC { public class MyClass { public int x=200; public int y; } } public class MyDerivedC:MyBaseC { new public class MyClass //nestedtypehidingthebasetypemembers { public int x=100; public int y; public int z; } public static void Main() { //Creating object from the overlapping class: MyClass S1=new MyClass(); //Creating object from the hidden class: MyBaseC.MyClass S2=new MyBaseC.MyClass(); Console.WriteLine(S1.x); Console.WriteLine(S2.x); }

輸出:
100
200

③.new約束:用於在泛型聲明中約束可能用做類型參數的參數的類型。

 

 

基礎題:

1.簡述List與string[]的區別。

2.簡述裝箱和拆箱操做中的性能損耗是如何產生的。

3.簡述對ASP.NET中的事件機制的理解。

4.在一個ASP.NET的三層結構系統中,以登陸操做爲例,簡述在各層中如何組織代碼。

5.簡述相比DATASET,實體類在WEB項目中的優勢與缺點。

6.簡述GC是如何工做的。

7.簡述3個熟悉的設計模式。

8.簡述UDP協議特色,以及如何提升UDP傳輸可靠性。

9.簡述.NET2.0,.NET3.0,.NET3.5各版本中推出的新特性。

算法題:(如下三題不用做答,想好思路面試談便可)

1. 一個整數數列,元素取值多是0~65535中的任意一個數,相同數值不會重複出現。0是例外,能夠反覆出現。

請設計一個算法,當你從該數列中隨意選取5個數值,判斷這5個數值是否連續相鄰。

注意:

- 5個數值容許是亂序的。好比: 8 7 5 0 6

- 0能夠通配任意數值。好比:8 7 5 0 6 中的0能夠通配成9或者4

- 0能夠屢次出現。

- 複雜度若是是O(n2)則不得分。

2. 設計一個在一百萬個數字中求十個最大的數算法

3. 有以下輸入:若干個由大寫英文字母構成的單詞,以’,’號隔開。如「ABCCD,CDA,BCDD,DCA,ADC,BCD,CDCAB」。 寫一段程序,從輸入中尋找由相同字符構成(重複字符出現次數也是同樣)的單詞組輸出。

如以上輸入,則輸出:

第1組:ABCCD,CDCAB

第2組:CDA,DCA,ADC

項目&管理:(如下兩題不用做答,想好思路面試談便可)

1.假設你作爲一個開發團隊的領導者,通過長時間的磨合,有了一隻10人左右的不錯的團隊。其中每一個成員都在其職位上有不可或缺的做用。現因爲一些緣由,須要你辭退其中一人。你會如何處理這件事情?

2.有一套公司本身開發供本公司使用的CRM系統,其中的權限控制過於簡單。現須要你從新設計其權限系統,你會如何開展這個工做?

非技術(面談):

1.在上份工做中,本身體現最大的優勢和缺點是什麼。


一、學校幾本(是否統招)、英語等級、大學成績排名Top%幾、當前月薪(入職前是否能提供薪資證實材料)、指望月薪

二本,統招
英語四級
排名top10

二、作過的項目技術棧是什麼?(例如 .NET、Sql Server、Dapper、EF、Redis……)

.NET、C#、EF、MVC、SQL Server、Oracle、WebService、API、SDK、Redis、JPush、Lucene.Net
Html、css、JavaScript、Ajax、Jquery、AngularJS、Bootstrap
iOS、Objective-C、Winforms、WPF

三、作過的項目中最大的表數據量大概多少?業務高峯期每分鐘併發請求數量大概多少?遇到的最大技術難點與解決方案,研究過的.NET開源項目,舉例說明3-5個

最大的表有200萬條數據,數據查詢出現慢的狀況,優化方案:在條件語句的列上加索引;優化SQL避免like,in、not in等;使用分頁臨時表避免全表掃描;
高峯期每分鐘併發請求2千左右;
技術難點:團隊創立初期,APP剛剛上線,功能在逐步完善。當時爲了推廣拉新,想開發一個功能,實現APP的在微信裏的傳播分享。網站享用的是微信開放平臺的網站應用號受權,還有另外一塊是微信公衆平臺公衆號分享,分別是不一樣的兩套APPID,受權以後會獲取到兩個不一樣的OpenID,但願用戶信息打通,用戶只要受權過一次以後就能在另外一個模塊實現免登錄。因爲當時一心想經過業務存儲兩個不一樣的OpenID的關聯關係,作到統一,結果走了很多彎路,仍然達不到想要的效果。
解決方案:UnionID,將兩個帳號在後臺關聯以後就能獲取到統一的UnionID,業務記錄此ID便可。

開源項目
Json.net Json序列化和反序列化,基本支持全部的json特性,性能也很好,MVC4的默認引用程序集中已包含.
Log4net 傳統的日誌框架,移植於log4jV1.2,高效,穩定
Html Agility Pack Html解析庫
DotNetZip 建立,壓縮,解壓Zip文件
DotNetCodes 一些經常使用的功能性代碼Utilities,能夠減小許多開發時間,並且類與類之間沒有什麼依賴,每一個類均可以單獨拿出來使用,excel導出、二維碼生成、網絡請求等;

四、.NET系統如何實現水平擴展、如何解決高併發問題,解決方案思路

應用服務和數據服務分離:把網站分爲應用服務器、文件服務器和數據庫服務器,不一樣服務器承擔不一樣角色,從而提成網站處理能力和文件存儲能力;
數據庫讀寫分離:經過配置主從服務器實現數據庫讀寫分離,改善數據庫負載壓力;
業務拆分:根據產品線拆分,例如訂單、商鋪、買家等,分歸不一樣業務團隊管理,不一樣業務分不一樣物理服務器處理,能夠經過消息隊列進行數據分發;
使用NoSQL和搜索引擎:應用服務器經過統一模塊訪問各類數據,減輕應用程序管理數據源的麻煩;
應用服務器集羣:經過負載均衡使一批設備共同對外提供服務,由統一調度服務器經過調度策略進行分發,當有服務器宕機時,調度服務器會將請求轉移到其餘服務器上,保證不影響用戶使用;
分佈式文件系統和分佈式數據庫系統:將業務拆分紅不一樣模塊,不一樣業務的數據庫放在不一樣的物理服務器上;
緩存:包括本地緩存、分佈式緩存、反向代理和CDN加速;
使用緩存改善網站性能:把業務常常訪問的數據緩存到內存中,能夠大大減小數據庫的讀取訪問壓力,從而改善寫入性能,方式有本地緩存和分佈式服務器緩存,部署大內存服務器;
反向代理和CDN加速:基本原理都是緩存,用戶請求服務時,經過距離判斷最近機房代理服務器中緩存這用戶請求的資源,直接返回給用戶,減輕後端服務器負載壓力;
異步操做:典型的生產者消費者模式,二者不存在直接調用,只要保持數據結構不便,彼此功能實現能夠隨意變化而不互相影響;
固態硬盤代替機械硬盤:使用SSD,物理設備上加快文件訪問速度;

五、國內外基於.NET技術的知名網站有哪些,.NET與Java相比有哪些優勢、缺點,如何看待微軟全新一代.NET Core開源、免費、跨平臺的將來發展前景

.NET知名網站
國外:microsoft、stackoverflow、codeproject、myspace、Godaddy、msn、
國內:cnblogs、csdn、智聯、攜程、必應、起點、凡客

.NET和java對比

開源和跨平臺,Java一直開源跨平臺,有很是豐富的社區資源;微軟14年也宣佈開源跨平臺,有.NET Core、xamarin,微軟正在努力,但作到Java如今的程度我的以爲還有很長一段路要走。
編程工具,C#有好用的IDE Visual Studio;Java之前有eclipse,如今有Intellij。
語言特性,二者語法相似,C#feature更多(語言特性,泛型、委託、重載運算符、LINQ、lambda、delegate、擴展等),語法糖也更多,程序員基本能夠專一邏輯而不用關注如何實現;而Java這塊比較貧乏。
更新速度,C#由微軟維護,版本更新快,支持更多新特性;java版本更新慢。
應用領域,C#目前主要應用在windows的PC應用,unitity3D,web。Java應用於web,Android,Hadoop等。
生態環境,我的認爲最重要的一點。開源庫和框架Java數不勝數,各類層面的解決方案眼花繚亂,C# web比較好用的框架只有asp .net、MVC。

.NET Core將來發展前景

我的看好 .Net Core 的將來發展前景。
.NET Core是一個開源通用的開發框架,支持跨平臺,即支持在Window,macOS,Linux等系統上的開發和部署,而且能夠在硬件設備,雲服務,和嵌入式/物聯網方案中進行使用。首先從Core的定位上來講,他摒棄了原有AspNet的那些臃腫組件,面向高性能服務器開發。雖然如今版本功能還比較弱,各種三方庫支持也沒有更新,可是這只是時間問題,以微軟的更新速度和推廣力度,幾年後必將完善。
基於微軟的 Azure 雲的平臺優點,後期勢必會加入 .Net Core 的支持,加上微軟的跨平臺戰略,對 Docker 的親和性,對於開發人員也很是友好,因此總體環境來講是健康發展的,將來技術決策時 .Net Core 也有很大的優點。
所以將來其發展主要看的就是微軟推廣力度及社區開發者的支持度。
喜歡C#就會一直堅持下去,由於興趣是最好的老師。

六、www.dot.net官網任選一篇英文技術文章,不用單詞軟件大概能看懂百分之多少?
看了一篇教學文章
https://www.microsoft.com/net/tutorials/csharp/getting-started/hello-world
所有英文文檔大概能看懂百分之80

七、咱們會根據以上信息進行崗位匹配度的評估(教育背景、技術能力、抽象總結能力……),節省應聘者的面試成本,提高招聘效率

八、爲了方便及時溝通,請加技術經理微信 2531685528 註明:應聘.NET 姓名

-------------------------------------------------------

【.NET技術面試參考資料、圖書】

一、《大型網站技術架構》

二、《Sql Server性能優化與管理的藝術》

三、《跟阿銘學Linux》

四、《深刻淺出MySQL數據庫開發優化與管理維護》

五、《微服務設計》

參考資料共享地址

http://pan.baidu.com/s/1nvUc1nz

http://www.apelearn.com/study_v2/

天天進步一點點
相關文章
相關標籤/搜索