做爲一個.NET程序員,應該知道的不只僅是拖拽一個控件到設計時窗口中。就像一個賽車手,必定要了解他的愛車 – 能作什麼不能作什麼。javascript
本文參考Scott Hanselman給出的.NET問題列表,整理以下。包括WinForms,ASP.NET,XML以及C#和.NET基礎相關的問題,有興趣的自我檢測一下吧~html
參考答案另附在文章末尾,因爲水平有限,不免有謬誤,歡迎指正。java
這裏問的是強名稱概念。Assembly.Load("foo.dll")加載程序集的方法是否正確?node
public class c{ public c(string a) : this() {;}; public c() {;} } 這個構造函數有用嗎?程序員
· 什麼叫做ViewState?是什麼編碼?加密了嗎?究竟是誰在使用ViewState?web
------------------------------------------------------------------------------------------------------------------------編程
------------------------------------------------------------------------------------------------------------------------瀏覽器
一個程序至少有一個進程,一個進程至少有一個線程。線程的劃分尺度小於進程,使得多線程程序的併發性高。緩存
這個解釋很形象:連接安全
Windows服務能夠在計算機啓動時自動啓動,能夠暫停和從新啓動並且不顯示任何用戶界面。
EXE 可執行程序一般有一個用戶界面,Console或 GUI,一般由用戶來啓動或中止。
以32位操做系統爲例,最大尋址是4G(含虛擬內存),是經過2的32次方計算的; 當物理內存小於4G時,進程訪問的內存量隨着虛擬內存的增長而增長,直到4G; 4GB內存實際上包含了程序的全部部分--包括可執行代碼,代碼加載的全部dll,以及程序運行時使用的全部變量的內容。這個4GB內存稱爲虛擬地址空間,或虛擬內存。
對設計有明顯影響的有2點:
在.NET中區別最明顯的是int的使用,在32位下和64位下存儲的數據不同(int 4個字節32位, 8個字節64位);另一個是編譯的程序爲X86則可在3二、64位下同時運行。
DLL中雖然包含了可執行代碼卻不能單獨執行,而應由Windows應用程序直接或間接調用。EXE就不用說了吧~
強類型是指儘可能早的檢查變量的類型, 一般在編譯的時候就檢查.
弱類型是指儘可能推後對變量類型的檢查, 一般在運行時檢查。
到底哪一個好? 其實各有各的好, 像ruby, javascript, 都屬於week-typing, 好處是寫代碼的時候比較快. C#屬於strong-typing, 好處是若是變量類型不對的話, 編譯不會經過, Visual Studio 還會有提示. 至於寫代碼的速度上講, 自從C# 3.0以來, 使用var來定義變量, 簡單了不少。
PID全稱是 Process Identifier, 就是進程的一個號碼, 一般當系統哪一個程序不聽使喚的時候, 能夠用它來把這個程序關閉. 並且Debug的時候, 也有用。
TCP/IP端口能夠被多少個進程分享
Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Socket socket2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket1.Bind(new IPEndPoint(IPAddress.Parse(」127.0.0.1″),8235)); socket1.Listen(10); socket2.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); socket2.Bind(new IPEndPoint(IPAddress.Parse(」127.0.0.1″), 8235)); socket2.Listen(10); Console.Read();
GAC 是指 Global Assembly Cache, 用處是放在這裏的程序集能夠被多個程序共同調用, .NET 中的大部分程序集都在這裏. 解決的問題是節省硬盤空間以及防止Dll Hell。
面向接口:定義要實現某類功能應該遵循的統一規範,而具體實現過程由實現該接口的類型決定。
面向對象:強調對具備相同行爲和屬性事物的封裝,更注重封裝的完整性和功能的完整性。
面向方面:主要提供與業務邏輯無關的操做。好比系統中有多個地方都用到文件上傳功能,可使用面向方面的思想在全部上傳文件以前對文件的大小、格式等信息進行過濾操做,而不是在每處上傳代碼裏面完成對這些信息的過濾。
接口(Interface): 不能實列化,本身沒有狀態,方法也沒有具體的實現,被繼承時,繼承類須要實現接口的全部方法。接口就像租房時網上下載的一個租房合同模板。
類 (Class): 能夠被實例化,有狀態,被繼承時,繼承類也不須要從新實現被繼承類中的方法。可是若是被繼承類的方法中有abstract修飾的,繼承類則須要實現這個方法。類像是已經被填上內容的租房合同的模板。
代碼在運行過程當中動態獲取程序集的信息,對象的信息,或者直接調用對象的方法或屬性。 e.g. var i = 100; i.GetType(); 輸出System.Int32。
XML Web service: 是開放標準,使用Http/SOAP協議交互。
.NET Remoting: 是微軟本身的技術,只能在.NET裏面使用。
early-binding: 是指編譯的時候綁定,late-binding是指運行時綁定。
動態引用。
Assembly.LoadFile只載入相應的dll文件,其餘文件並不會被載入。
Assembly.LoadFrom會載入dll文件及其引用的其餘dll
這裏問的是強名稱概念。
它不是一個文件名,相比文件名,Assembly Qualified Name更能肯定一個程序集,它包含文件名,但同時包含版本,公鑰,和區域。由於一樣一個名稱的文件可能有不一樣的版本和區域,此時單獨靠文件名稱,可能會形成不能肯定程序集的正確性。
不對,正確方式爲:Assembly.Load("foo, Version=1.0.2004.0, Culture=neutral, PublicKeyToken=8744b20f8da049e3")
經過簽發具備強簽名的程序集合,能夠確保名稱的全局惟一性!由於強名稱是依賴於惟一的密鑰對來確保名稱的惟一性,其餘人不會生成與你相同的程序集名稱(不一樣的私鑰產生的名稱不一樣)。強名稱保護程序集的版本沿襲,由於強名稱的惟一性可以確保沒有其餘人可以生成你的程序集的後續版本。強名稱提供可靠的完整性檢查,經過.NET Framework安全檢查後,能夠確保程序集內容在生成後未被更改過!
DateTime 不能爲null。由於其爲Struct,屬於值類型,值類型不能爲null,只有引用類型才能被賦值null。
JIT(Just In Time),這是咱們經過.NET編譯器生成的應用程序最終面向機器的編譯器
本機映像生成器 (Ngen) 是一種提升託管應用程序性能的工具。 Ngen.exe 建立本機映像(包含經編譯的特定於處理器的機器代碼的文件),並將它們安裝到本地計算機上的本機映像緩存中。運行時可從緩存中使用本機映像,而沒必要使用實時 (JIT) 編譯器編譯原始程序集。
因爲 JIT 編譯器會在調用程序集中定義的單個方法時將該程序集的 MSIL 轉換爲本機代碼,於是一定會對運行時的性能形成影響。在大多數狀況下,這種性能影響是能夠接受的。更爲重要的是,由 JIT 編譯器生成的代碼會綁定到觸發編譯的進程上。它沒法在多個進程之間進行共享。爲了能在多個應用程序調用或共享一組程序集的多個進程之間共享生成的代碼,公共語言運行庫支持一種提早編譯模式。此提早編譯模式使用本機映像生成器 (Ngen.exe) 將 MSIL 程序集轉換爲本機代碼,其做用與 JIT 編譯器極爲類似。可是,Ngen.exe 的操做與 JIT 編譯器的操做有三點不一樣:
· 它在應用程序運行以前而不是運行過程當中執行從 MSIL 到本機代碼的轉換。
· 它一次編譯一個完整的程序集,而不是一次編譯一個方法。
· 它將本機映像緩存中生成的代碼以文件的形式持久保存在磁盤上。
.NET的垃圾回收分爲3代,可經過GC.Collect強制處理。
一個對象實例沒有被任何地方引用時就稱爲垃圾,當內存不夠是GC就會將該對象實例佔用的空間清理出來
Finalize只釋放非託管資源;
Dispose釋放託管和非託管資源
Finalize和Dispose共享相同的資源釋放策略,所以他們之間也是沒有衝突的。
有用,限定資源做用域並自動釋放。
IDisposable是一個接口,有一個方法Dispose(),能夠在對象出做用域的時候調用,如在Using出界後調用這個接口。
列出全部使用符合引號內pattern的dll的進程.
In-proc 發生在一個進程以內, Out-of-proc 發生在不一樣進程之間。
Xp : aspnet_Wp.exe
Windows 2000 : inetinfo.exe
Windows 2003 : w3wp.exe
通常使用DateTime.TryParse解析。
PDBs是源碼編譯文件-全稱Program Database,這個文件主要會存儲對應模塊(dll或者exe)內部的全部符號,以及符號對應的地址、文件名和行號。調試的時候應用程序和源文件之間的一個橋樑。
一種代碼複雜度的衡量標準。
能夠用來衡量一個模塊斷定結構的複雜程度,數量上表現爲獨立現行路徑條數,也可理解爲覆蓋全部的可能狀況最少使用的測試用例數。圈複雜度大說明程序代碼的判斷邏輯複雜,可能質量低且難於測試和維護。程序的潛在風險和高的圈複雜度有着很大關係。
lock 關鍵字可確保當一個線程位於代碼的臨界區時,另外一個線程不會進入該臨界區。 若是其餘線程試圖進入鎖定的代碼,則它將一直等待(即被阻止),直到該對象被釋放。
public class MySingleton { private static object myLock = new object(); private static volatile MySingleton mySingleton = null; private MySingleton() { } public static MySingleton GetInstance() { if (mySingleton == null) { //第一次檢查 lock (myLock) { if (mySingleton == null) { // 第二次檢查 mySingleton = new MySingleton(); } } } return mySingleton; } }
FullTrust即爲徹底信任,也稱爲盲目信任.
GAC:有FullTrust權限
更加靈活的設置對代碼的訪問權限,實現代碼級保護,防止被移動代碼惡意利用
全局程序集緩存中若是有Corillian就更新該程序集,沒有就安裝。
顯示程序集的公鑰標記。
因DCOM的端口號是隨機分配的,默認狀況下,會分配1024以上的端口號,因此默認狀況下,DCOM不能穿越防火牆。
135是遠程過程調用(RPC)的默認端口
OOP是一種編程模型,將複雜的邏輯分解出小的模塊,特性是繼承,封裝和多態。而SOA是一個技術框架。 SOA的思想是將業務邏輯封裝成服務或者中間件提供給應用程序來調用,固然其組件化思想是繼承和發揚了OOP的優勢。
XmlSerializer是將對象的屬性和字段進行序列化和反序列化的,序列化成爲xml數據,反序列化再將xml轉換成對象。應該至少須要ACL權限中的讀權限。
由於try-catch有性能損失,在性能要求高的場景下,頻繁使用效果不好。同時,catch(Exception)後,可能會破壞程序的正常執行邏輯,致使閱讀、調試代碼難度增大。
Catch的時候應該捕捉具體的Exception類型,而不是通用的Exception
Debug只在debug狀態下會輸出,Trace在release下也會輸出,在release下Debug的內容會消失。Debug會產生pdb文件,release不會。
Debug和Release編譯產出物不同,Release下無調試信息,如Assert沒法使用。對程序運行速度而言,無明顯區別。建議在開發環境下用Debug編譯,發佈環境下用Release,爲了使用Assert斷言。
方法,因對於一次運行,極可能只用到一個程序集中極少數類型和對象,而大部分可能並不會被使用。
接口(Interface)是用來定義行爲規範的,不會有具體實現,而抽象類除定義行爲規範外,能夠有部分實現,但一個類能實現多個接口,但只能繼承一個基類。接口是是一種契約,定義了繼承它的類必須聲明接口中的方法。
區別:
接口只有方法、屬性、事件和索引符;類除了這四種成員以外還能夠別的成員(如字段)。接口沒有構造函數,類有構造函數。
接口不能進行運算符的重載,類能夠進行運算符重載。
接口的成員沒有任何修飾符,其成員老是公共的,而類的成員則能夠有修飾符。派生於接口的類必須實現接口中全部成員的執行方式,而從類派生的則否則。
equals:比較兩個變量的內容是否相等
==:操做比較的是兩個變量的值是否相等,對於引用型變量表示的是兩個變量在堆中存儲的地址是否相同,即棧中的內容是否相同。
對象一致指的是引用相同。對象相等指的是內容相等。
深複製將會在新對象中建立引用類型字段引用的全部對象,改變新對象中引用的任何對象,不會影響到原來的對象中對應字段的內容。
ICloneable 接口能夠提供建立現有對象中複製的自定義實現。
拆箱就是引用類型轉換爲值類型,一般伴隨着從堆中複製對象實例的操做
裝箱就是值類型數據轉換爲Object類型的引用對象
引用類型
把不參與序列化的對象標註出來,只序列化有用的數據,而不是序列化整個對象。去除不必的數據冗餘,和提高序列化時的性能。
之因此說out參數很差,是由於經過out參數傳值,間接了破壞了封裝性和函數的可讀性。但筆者認爲有的時候仍是很實用很方便的。
能夠。至少比較省事。
/// <summary>The EnableWindow Function.</summary> [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool EnableWindow(System.IntPtr hWnd, [MarshalAs(UnmanagedType.Bool)]bool enable);
override new在基類沒有virtual關鍵字的狀況下必須使用。反作用是破壞了繼承關係。
virtual:virtual 關鍵字用於修飾方法、屬性、索引器或事件聲明,並使它們能夠在派生類中被重寫。例如,此方法可被任何繼承它的類重寫。
sealed:當對一個類應用 sealed 修飾符時,此修飾符會阻止其餘類從該類繼承。
override:要擴展或修改繼承的方法、屬性、索引器或事件的抽象實現或虛實現,必須使用 override 修飾符。
abstract:abstract 修飾符能夠和類、方法、屬性、索引器及事件一塊兒使用。在類聲明中使用 abstract 修飾符以指示某個類只能是其餘類的基類。標記爲抽象或包含在抽象類中的成員必須經過從抽象類派生的類來實現。
Foo.Bar: 程序集名稱
Version=2.0.205.0: 程序集版本
Culture=neutral: 區域
PublicKeyToken: 程序集public密鑰
public: 對任何類和成員都公開, 無限制訪問;
protected: 僅僅對該類以及該類的派生類公開;
private: 僅僅對該類公開;
internal: 只能值包含該類的程序集中訪問該類(只是單獨的項目,而不是整個解決方案)
主互操做程序集(PIA)指的是官方發佈的互操做程序集,若是電腦中安裝了PIA,當你添加對類庫的引用時,那麼Visual Studio會自動加載PIA,微軟爲Office應用程序提供了PIA,如EXcel PIA就是Microsof.Office.Interop.Excel.dll,其餘應用程序也相似。詳見:http://msdn.microsoft.com/zh-cn/library/aax7sdch(v=vs.110).aspx
.NET 反射,爲測試方法加了Attribute
throw e; //CLR認爲這裏是異常的起始點
throw; //CLR不會從新設置異常的起始點
Typeof()是運算符而GetType是方法
GetType()是基類System.Object的方法,所以只有創建一個實例以後纔可以被調用(初始化之後)
Typeof()的參數只能是int,string,String,自定義類型,且不能是實例
public class c{ public c(string a) : this() {;}; public c() {;} } 這個構造函數有用嗎?
先調用了this(),即無參構造函數,再調用了自身的有參的構造函數。
由於未對a參數進行處理,故無用。
This 用於調用當前實例,沒法在 static 方法中調用 this。
aspx <form method=」post」 action=」test.aspx」> <input name=」Button1」 type=」submit」 /> </form> Cs protected void Page_Load(object sender, EventArgs e) { if (Request["Button1"] != null) { //Button1_OnClick Function Code } }
頁面數據從客戶端經過Form的Post方法傳輸到服務器端的過程叫作PostBack。
· 什麼叫做ViewState?是什麼編碼?加密了嗎?究竟是誰在使用ViewState?
保存服務器控件在PostBack時狀態不變的技術叫作ViewState。這些狀態信息被保存在前臺的hidden元素中。默認爲Base64編碼,默認不會ViewState被加密。在頁面中全部開啓了ViewState的服務器控件會使用到它。 參考
Machinekey是添加在web.config中<system></system>之間的一個標籤。它保證cookies、viewstate加密解密時的數據不會被篡改。參考
Process:優勢:進程內。速度比較快,但比較難適應大型應用。
ASP.NET State Service: ASP.NET狀態服務。速度,容量上折中。若是使用專用的狀態服務器則能夠擴展。
SQL Server Session State Management: 速度較慢。但可靠性是最強的。並且也有很高的擴展性,適合大型應用。
當使用線程池中的線程進行異步請求操做時,多個請求間的線程是可以重用的。每一個HttpRequest都有本身的線程。當線程重用時,應該使用Thread Local存儲。
檢查ContentType便可。更安全的作法是解析HttpHandler。
用戶輸入URL,路由將該次請求轉到DNS服務器,DNS服務器將請求轉向URL所指向的服務器IP,若是IIS中某個站點包含所請求主機頭信息,則請求成功。
服務器在告訴客戶端,須要將須要一些服務器必要信息存成cookies保存在客戶端中,而每次客戶端訪問服務器時會將cookies中的信息經過請求發送給服務器。濫用的例子好比:Cookies中保存敏感信息,用戶密碼。
驗證用戶輸入的全部內容,保證服務器的安全性和健壯性。
Header共包括通用頭、請求消息、響應消息及消息實體等數據。
Get方法爲URL傳值,POST爲Form表單傳值。
200 訪問成功、301 永久重定向、302暫時重定向、304服務器已緩存、404訪問資源不存在、500服務器出錯、504 網關超時。
if-not-modified-since及 last-modified是保存在Request http header中的兩個信息,客戶端在訪問資源時,對比兩個信息,就能肯定須要讀取緩存文件仍是更新本地緩存文件。Response.Content.Headers
Explain <@OutputCache%> and the usage of VaryByParam, VaryByHeader.
VaryByCustom,咱們能夠自定義輸出緩存要求的任意文本。除了在OutputCache指令裏面申明該屬性以外,咱們還得在應用程序的 global.asax 文件的代碼聲明塊中,重寫GetVaryByCustomString 方法來爲自定義字符串指定輸出緩存的行爲。
Eg:
<%@ OutputCache VaryByParam="none" VaryByCustom="CategoryPageKey" Location="server" Duration="43200" %>
這裏的VaryByCustom定義的爲CategoryPageKey,那麼在global.asax裏面咱們必須定義CategoryPageKey這個字符創輸出緩存的行爲,見下面代碼。
public override string GetVaryByCustomString(HttpContext context, String arg) { … }
提供避免元素命名衝突的方法
DOM是一種與瀏覽器,平臺,語言無關的接口,使你能夠訪問頁面其餘的標準組件。 DOM解決了Netscape的Javascript和Microsoft的Jscript之間的衝突,給予web設計師和開發者一個標準方法,讓他們來訪問他們站點中的數據、腳本和表現層對像。
DOM尺寸不受限制。
它由一組非專有的 Web 服務規範以及對這些旨在促進互操做性的規範的說明和修正組成
爲相關Web服務更好的一塊兒互操做的使用提供了實現的指導方針
<?xml version="1.0" encoding="UTF-8"?> <note> <to>a</to> <from>b</from> </note>
數據自己應當存儲在元素中,而有關數據的信息(元數據)應當存儲在屬性
屬性不能很好地保持原文的結構
元素容許包括元元數據(有關信息的更深層次的信息)。
每一個人對元數據和非元數據的理解是不同的。
面對之後的變化,元素更具擴展性。
對於很是簡單而且不隨文檔改變其形式的信息,使用屬性較好。特別是樣式信息和連接信息,做爲屬性執行起來很順利
格式無缺的XML不是有效的xml
不只要格式無缺並且還要遵循必定的順序規則
格式無缺的(well-formed)XML文檔包括:起始標籤和結束標籤應當匹配,結束標籤是必不可少的;大小寫應一致:XML對字母的大小寫是敏感的,和是徹底不一樣的兩個標籤,因此結束標籤在匹配時必定要注意大小寫一致;元素應當正確嵌套:子元素應當徹底包括在父輩元素中。
有效的(valid)XML文檔是指一個遵照XML語法規則,並遵照相應DTD文件規範的XML文檔。
XmlReaderSettings settings = new XmlReaderSettings(); settings.ValidationEventHandler += new ValidationEventHandler(this.ValidationEventCallBack); settings.ValidationType = ValidationType.Schema; settings.Schemas serch= schemaSet;
這個會遞歸搜索所有的Document節點,一般消耗會比較大。除非真的須要檢索全部叫mynode的節點,那就比較好。
XmlReader 是一個只進、只讀的遊標。 它提供了對輸入的快速和非緩存的流式訪問。 它能夠讀取流或文檔。 它使用戶能夠提取數據,並跳過對應用程序沒有意義的記錄。 較大的差別在於 SAX 模型是一個「推送」模型,其中分析器將事件推到應用程序,在每次讀取新節點時通知應用程序,而使用 XmlReader 的應用程序能夠隨意從讀取器提取節點。
XPathDocument 類讀取 XML 文檔-在內存中的快速只讀表示形式
可編輯的 XmlDocument 類讀取 XML 文檔
XML片斷一般不是一個徹底符合標準的XML文檔,可能沒有根節點,好比:「<foo></foo><bar></bar>」。XML文檔一般有一個根節點和一些由標記組成的內容。好比:「<root><foo></foo><bar></bar></root>」
規範化形式的XML是XML規範的一個子集。任何XML文檔均可以轉換爲規範化形式的XML,所以將特定類型的微小差別去除卻還是該XML文檔。
XML InfoSet是W3C規範,用於描述一組數據集的抽象數據模型。XML DOM是InfoSet的一個實例。
DTD經過合法元素和屬性列表定義XML文檔的文檔結構。XSD描述XML文檔的文檔結構。
支持。設置XmlReaderSettings.DtdProcessing屬性爲DtdProcessing.Parse。設置XmlReaderSettings.ValidationType屬性爲ValidationType.DTD。
是的。