C#面試題2(子文章)持續更新

-----> 總文章 入口

什麼是MVC?

MVC是一個設計模式,它強制性的使應用程序的輸入、處理和輸出分開
Model:模型層
View:視圖層
Controller:控制層

你能解釋下MVC 的完整流程嗎?

MVC的處理過程,首先控制器接收用戶的請求,並決定應該調用哪個模型來進行處理,
然後模型用業務邏輯來處理用戶的請求並返回數據,
最後控制器用相應的視圖格式化模型返回的數據,並通過表示層呈現給用戶。

MVC優缺點是什麼?

優點:
使你的軟件在健壯性,代碼重用和結構方面上一個新的臺階

缺點:
額外的工作量和複雜性

post 和 get 的區別?

POST和GET是HTTP請求的兩種方式,都可實現將數據從瀏覽器向服務器發送帶參數的請求。
HTTP請求底層協議都是TCP/IP,所以兩者沒有本質的區別。
區別就在於數據存儲的位置。各自有適用環境,根據需求選擇合適的方法即可

  1. GET提交的數據放在URL中,POST則不會。這是最顯而易見的差別。
    這點意味着GET更不安全(POST也不安全,因爲HTTP是明文傳輸抓包就能獲取數據內容,要想安全還得加密)
  2. GET回退瀏覽器無害,POST會再次提交請求(GET方法回退後瀏覽器再緩存中拿結果,POST每次都會創建新資源)
  3. GET提交的數據大小有限制(是因爲瀏覽器對URL的長度有限制,GET本身沒有限制),POST沒有
  4. GET可以被保存爲書籤,POST不可以。這一點也能感受到。 GET能被緩存,POST不能 GET只允許ASCII字符,POST沒有限制
  5. GET會保存再瀏覽器歷史記錄中,POST不會。這點也能感受到。

請說明在.net 中常用的幾種頁面間傳遞參數的方法,並說出他們的優缺點?

  1. 使用QueryString, 如…?id=1; response. Redirect()…
    優點: 簡單,粗暴
    缺點:
    QueryString 有一個最大長度,如果你必鬚髮送很多信息這種方法不起作用。
    QueryString 在您的瀏覽器的地址部分中可見,因此您不應將其與敏感信息一起使用。
    QueryString 不能用於發送&和空格字符。
  1. Session&Cookie
    缺點:
    Session變量存儲大量的數據會消耗較多的服務器資源。容易丟失.
    Cookie 以簡單的文本格式存儲數據,因此根本不安全。
    Cookie數據有一個大小限制(4096字節/ 4KB), 允許的最大cookie數量也是有限的
  1. Application
    缺點:
    作爲全局變量容易被誤操作。所以單個用戶使用的變量一般不能用application。
  1. Server.Transfer 終止當前頁面的執行並開始執行當前請求的新頁面。

>>>查看詳情

在MVC中如何保持Sessions?及各種方法有什麼不同?

MVC Controller有多少種不同的結果類型?

ActionResult
ContentResult
EmptyResult
HttpUnauthorizedResult
JavaScriptResult
JsonResult
FileResult
FileContentResult
FilePathResult
FileStreamResult
RedirectResult
RedirectToRouteResult
RedirectToActionResult
ViewResultBase
ViewResult
PartialViewResult

ADO.net中常用的對象有哪些?分別描述一下

SqlConnection 連接數據庫
SqlCommand 命令對象.執行的命令和存儲過程!
SqlDataAdapter 適配器
SqlDataReader 數據讀取器
DataSet 數據集,相當與內存中的一張表或多張表.

如何處理幾十萬條併發數據

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

在C#中,string str = null 與 string str = “” .說明其中的區別.

一個是什麼都沒有,一個是空字符串,
string str=null 把這個引用指向了一個null,沒有地址沒有值的地方。不佔用任何空間.
string str="" 把這個引用指向了一個地址,地址裏面存的是空的字符。

C# 中 new 有幾種用法?

1)new 運算符:用於創建對象和調用構造函數。這種大家都比較熟悉.
2)new 修飾符:在用作修飾符時,new 關鍵字可以顯式隱藏從基類繼承的成員。
3)new 約束:用於在泛型聲明中 約束 可能用作類型參數的參數的類型。

什麼叫做泛型?

通過 參數化類型 來實現在同一份代碼上操作多種數據類型

談談你對EF 的理解

原先用的是三層架構中ADO.NET做底層開發,純手工sql語句拼裝。後來遇到一個MVC+EF項目,體會到了EF的強大性。
它是微軟封裝好一種ADO.NET數據實體模型,將數據庫結構以ORM模式映射到應用程序中。
優點:
1.簡潔的Linq to Sql語句大大提高了開發人員的效率,不要再寫複雜的sql語句;
2.不再需要再管應用程序如何去連接數據庫;
3.EF可以用作用於數據服務和OData Service的基礎設施;
缺點:
1.由於linq語句編譯之後就是sql,對於這種自動生成的sql語句無法控制;
2.EF的運行機制會消耗大量內存,大大降低了程序運行效率,從而導致降低了用戶在客戶端的體驗效果;
3.一旦數據結構發生變化,需要更新EF數據model;有時還可能會出現找不到更新過的實體類這種情況;

什麼叫做SQL注入?如何防止?

所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
具體來說,它是利用現有應用程序,將(惡意)的SQL命令注入到後臺數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊.

防護 歸納一下,主要有以下幾點:
1.永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和 雙"-"進行轉換等。
2.永遠不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。
3.永遠不要使用管理員權限的數據庫連接,爲每個應用使用單獨的權限有限的數據庫連接。
4.不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。
5.應用的異常信息應該給出儘可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝
6.sql注入的檢測方法一般採取輔助軟件或網站平臺來檢測,軟件一般採用sql注入檢測工具jsky,網站平臺就有億思網站安全平臺檢測工具。MDCSOFT SCAN等。採用MDCSOFT-IPS可以有效的防禦SQL注入,XSS攻擊等。


簡述 a.Equals(b) 和 a==b 的區別?

a==b:
當a和b指向同一對象時爲true,
即a和b指向內存和內存地址的內容都相同時才爲true;(地址相同,內容必相同)

a.equals(b):
當a和b的值相同時,即爲ture;(只判斷值相等)

ASP.NET的Application、Session、Cookie、ViewState和Cache等變量的區別是什麼?

Application是公共的,所有人都能看到,所以可以用來做聊天室,
session是私有的,每個客戶端都存在一個不同的session 生存期正常是20分鐘,也可以自己設定爲1分鐘或2個小時
cookie是保存在本機的文件,記錄短小的信息,除非你讓cookie過期,否則會一直存在
viewstate類似於asp中的hidden控件,用來記錄頁面中的控件的狀態的,主要在頁面間信息傳遞時用,
cache是緩存,用來記錄已經執行過的一些數據,比如讀取數據庫,目的是加速顯示,減少服務器的負擔,過期時間也是可以自己設定的,

簡述 asp.net webapi 相對於 asp.net mvc 的優點?

MVC主要用來構建網站,既關心數據也關心頁面展示,而Web API只關注數據
Web API支持格式協商,客戶端可以通過Accept header通知服務器期望的格式 Web API支持SelfHost,MVC目前不支持 Web API通過不同的http verb表達不同的動作(CRUD),MVC則通過Action名字表達動作
Web API內建於ASP.NET System.Web.Http命名空間下,MVC位於System.Web.Mvc命名空間下,因此model binding/filter/routing等功能有所不同 Web API非常適合構建移動客戶端服務

簡述asp.net 請求的生命週期?

  1. 頁面請求:頁面請求發生在頁面生命週期開始之前,用戶請求頁時,ASP.NET將確定是否需要分析和編譯頁
  2. 開始:在開始階段,將設置頁屬性,如Request和Response。在此階段,頁還將確定請求是回發請求還是新請求,並設置IsPostBack屬性
  3. 頁初始化:在頁初始化期間,可以使用頁中的控件,並設置每個控件的UniqueID屬性。
  4. 加載:在加載期間,如果當前請求是回發請求,則將使用從視圖狀態和控件狀態恢復的信息加載控件屬性。
  5. 驗證:在驗證期間,將調用所有驗證程序控件的Validate方法,此方法將設置各個驗證程序控件和頁的IsValidate屬性。
  6. 回發事件處理:如果請求是回發請求,則將調用所有事件處理程序
  7. 呈現:在呈現之前,會針對該頁和所有控件保存視圖狀態。在呈現階段中,頁會針對每個控件調用Render方法,它會提供一個文本編寫,用於將控件的輸出寫入頁的Response屬性和OutputStream中
  8. 卸載:完全呈現頁並將頁發送至客戶端、準備丟棄該頁後,將調用卸載。此時,將卸載頁屬性並執行清理。

ORM 中的延遲加載與直接加載有什麼異同?

延遲加載(lazyload)(也稱爲懶加載),
延遲加載機制是爲了避免一些無謂的性能開銷而提出來的,
所謂延遲加載就是當在真正需要數據的時候,才真正執行數據加載操作。
可以簡單理解爲,只有在使用的時候,纔會發出sql語句進行查詢。

簡述 Func 與Action 的區別?

.Net內置的委託。
Func有返回值
Action 無返回值

開啓一個異步線程的幾種方式?多線程編程時的注意事項?

Thread
ThreadPool
Task new
Task Factory
Task.Run()
注意事項:
一定要考慮公共資源的線程安全性 一般非阻塞狀態下每個循環都要有SLeep,這樣保證減少線程對CPU的搶奪
線程的終止一般要使線程體在完成一件工作的情況下終止,一般不要直接使用拋出線程異常的方式終止線程。

簡述Linq 是什麼,編寫一個Linq to object的示例代碼

Language Integrated Query(LINQ,語言集成查詢) 使用相同API操作不同的數據源

// 示例代碼
var racer = from r in Formula1.GetChampions()
            where r.Wins > 15 && r.Country == "Austria"
            select r;

簡述面向對象的特性有哪些? 你是如何理解的?

封裝 :就是類的私有化。將代碼及處理數據綁定在一起的一種編程機制,該機制保證程序和數據不受外部干擾。
繼承: 就是保留父類的屬性,開擴新的東西。通過子類可以實現繼承,子類繼承父類的所有狀態和行爲,同時添加自身的狀態和行爲。
多態: 是允許將父對象設置成爲和一個和多個它的子對象相等的技術。包括重載和重寫。重載爲編譯時多態,重寫是運行時多態。

重載:兩個或者多個函數在同一類中,名一樣,參數列表不一樣
重寫:在父類有個函數,在子類也又有一個同樣名字的函數,而且在子類內中把這個功能做的更具體化。

列舉你所知道的設計模式? 你在真實項目中使用過哪些?有什麼心得?

  1. 單例模式: 確保一個類只有一個實例,並提供一個全局訪問點. 例子: 用 全局的Log4實例 去記錄系統日誌
  2. 工廠模式: 通過工廠模式可以降低對象之間的耦合度,符合開閉原則 例子: 多個功能相同的方法可以使用工廠模式,使得系統更容易擴展。
  3. 策略模式: 定義了一組算法(業務規則)這族的算法可互換代替. 例子: 在運行時動態選擇具體要執行的行爲。對客戶隱藏具體策略(算法)的實現細節,彼此完全獨立

持續更新中…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章