標籤:style class blog code http ext
面向介面、物件導向和面向方面編程區別
面向介面編程 是物件導向編程體系中的思想精髓之一 (部落格園文章連結面向介面編程詳解(一)——思想基礎)
面向介面編程 介面是一組規則集合
物件導向編程 對具有相同行為和屬性事物的封裝 重用性、靈活性、擴充性
面向方面編程 (AOP面向方面編程)
介面和類的區別
關鍵字 class,interface
介面不能被執行個體化
介面支援多重繼承
介面不去實現方法和屬性
繼承介面的類需要實現介面的所有方法
類可以被執行個體化
繼承類的類不需要實現非abstract修飾的所有方法
類可以繼承多個介面,但只能繼承一個類
反射
反射(Reflection)是.NET中的重要機制,通過反射,可以在運行時獲得.NET中每一個類型(包括類、結構、委託、介面和枚舉等)的成員,包括方法、屬性、事件,以及建構函式等。
還可以獲得每個成員的名稱、限定符和參數等。
設計模式中
採用反射技術可以簡化工廠的實現
1.Factory 方法:通過反射可以將需要實現的子類名稱傳遞給Factory 方法,這樣無須在子類中實作類別的執行個體化。
2.抽象工廠:使用反射可以減少抽象工廠的子類。
採用反射技術可以極大簡化對象的產生
1.命令模式:可以採用命令的類型名稱作為參數直接獲得命令的執行個體,並且可以動態執行命令。
2.享元模式:採用反射技術執行個體化享元可以簡化享元工廠。
反射示範代碼,如下:
static class Program { /// <summary> /// 應用程式的主進入點。 /// </summary> //[STAThread] static void Main() { //Application.EnableVisualStyles(); //Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new Form1()); System.Console.WriteLine("列出程式集中的所有類型"); //System.Reflection.Assembly 表示一個程式集,它是一個可重用、無版本衝突並且可自我描述的通用語言執行平台應用程式構造塊 Assembly a = Assembly.LoadFrom("Reflection.exe"); //型別宣告 Type[] mytypes = a.GetTypes(); foreach (Type t in mytypes) { System.Console.WriteLine(t.Name); } System.Console.ReadLine(); System.Console.WriteLine("列出HellWord中的所有方法"); Type ht = typeof(HelloWorld); // System.Reflection.MethodInfo 探索方法的屬性並提供對方法中繼資料的訪問 MethodInfo[] mif = ht.GetMethods(); foreach (MethodInfo mf in mif) { System.Console.WriteLine(mf.Name); } System.Console.ReadLine(); System.Console.WriteLine("執行個體化HelloWorld,並調用SayHello方法"); //執行個體化HelloWorld Object obj = Activator.CreateInstance(ht); string[] s = { "zhenlei" }; //執行個體化HelloWorld Object objName = Activator.CreateInstance(ht, s); // System.Reflection.BindingFlags //指定控制綁定和由反射執行的成員和類型搜尋方法的標誌。 //此枚舉有一個 FlagsAttribute 特性,通過該特性可使其成員值按位組合。 BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly); MethodInfo msayhello = ht.GetMethod("SayHello"); msayhello.Invoke(obj, null); msayhello.Invoke(objName, null); System.Console.ReadLine(); System.Console.Read(); } } /// <summary> /// HelloWorld類 /// </summary> public class HelloWorld { string myName = null; /// <summary> /// 建構函式 /// </summary> /// <param name="name"></param> public HelloWorld(string name) { myName = name; } /// <summary> /// 建構函式 /// </summary> public HelloWorld() : this(null) { } /// <summary> /// 屬性 /// </summary> public string Name { get { return myName; } } /// <summary> /// 方法 /// </summary> public void SayHello() { if (myName == null) { System.Console.WriteLine("Hello World"); } else { System.Console.WriteLine("Hello," + myName); } } }
XML Web Service跟.NET Remoting的不同
Web 服務使用的訊息機制,而Remoting採用的RPC。
Web Service能用於不同平台,不同語言,Remoting只適用於.NET。
效率上Remoting高於XML Web Service。( .NET Remoting和WebService)
early-binding 和late-binding 的區別
early-binding 編譯時間綁定
late-binding 運行時綁定
Assembly.Load是靜態引用還是動態引用
動態
Assembly.LoadFrom和Assembly.LoadFile,2者使用的時機有何不同
Assembly.LoadFrom會載入DLL檔案及其引用的其他DLL
Assembly.LoadFile只載入相應的DLL檔案
什麼是Assembly Qualified Name
Assembly Qualified Name(組件限定名稱),相比檔案名稱更能確定一個程式集,它包含檔案名稱,但同時包含版本,公開金鑰和地區。
Assembly.Load("foo.dll")載入程式集的方法是否正確
不正確。應為:Assembly.Load("foo, Version=1.0.2004.0, Culture=neutral, PublicKeyToken=8744b20f8da049e3")
強簽名的程式集與非強簽名的程式集有何不同
強式名稱是由程式集的標識加上公開金鑰和數位簽章組成的。其中,程式集的標識包括簡單文本名稱、版本號碼和地區性資訊(如果提供的話)。
強式名稱的作用主要有三個:
區分不同的程式集;
確保代碼沒有篡改過;
在.NET中,只有強式名稱簽名的程式集才能放到全域組件快取中 (強式名稱(1)使用強式名稱保護代碼完整性)
DateTime 可以為null嗎
DateTime不能為null。DateTime屬於實值型別,實值型別不能為null。只有參考型別才能被賦值null。
什麼是 JIT、什麼是 NGEN、分別的優勢和劣勢是什嗎?
JIT(Just In Time)這是我們通過.NET編譯器產生的應用程式最終面向機器的編譯器
本機映像產生器(Ngen)是一種提高託管應用程式效能的工具。
Ngen.exe建立本機映像(包含經編譯的特定於處理器的機器代碼的檔案),並將它們安裝到本機電腦上的本機映像緩衝中。
運行時可從緩衝中使用本機映像,而不必使用即時(JIT)編譯器編譯原始程式集。
由於JIT編譯器會在調用程式集中定義的單個方法時將該程式集的MSIL轉換為機器碼,因而必定會對運行時的效能造成影響。
在大多數情況下,這種效能影響是可以接受的。更為重要的是,由JIT編譯器產生的程式碼會綁定到觸發編譯的進程上。它無法在多個進程之間進行共用。
為了能在多個應用程式調用或共用一組程式集的多個進程之間共用產生的程式碼,公用語言運行庫支援一種提前編譯模式。
此提前編譯模式使用本機映像產生器(Ngen.exe)將MSIL程式集轉換為機器碼,其作用與JIT編譯器極為相似。
Ngen.exe的操作與JIT編譯器操作有三點不同:
它在應用程式運行之前而不是運行過程中執行從MSIL到機器碼的轉換
它一次編譯一個完整的程式集,而不是一次編譯一個方法
它將本機映像緩衝中產生的程式碼以檔案的形式持久儲存在磁碟上
如何在.NET CLR的分代垃圾收集器管理對象的生命週期?什麼是不確定性終結?
.net記憶體回收行程原理
.NET的記憶體回收分為3代,可通過GC.Collect強制處理
Finalize()和Dispose()的區別
Finalize只釋放非託管資源
Dispose釋放託管和非託管資源
Finalize和Dispose共用相同的資源釋放策略,因此他們之間也是沒有衝突的。
Using()模式有用嗎? IDisposable是什嗎? 它如何支援確定性終結?
using()限定資源範圍並自動釋放
IDisposable是一個介面,有一個方法Dispose(),可以在對象出範圍的時候調用,如在using出界後調用這個介面。
tasklist /m "mscor*" 命令列的作用
列出所有使用符合引號內 名稱 的DLL的進程和模組。
in-proc 和 out-of-proc 之間的區別是什麼
In-proc 在一個進程內,進程內能共用代碼和資料區塊,out-of-proc 是進程外,進程外的互操作需要用進程間通訊來實現。
out-of-proc是基於什麼技術實現的
.Net Remoting技術或者WCF技術
當你在ASP.NET中運行一個組件時,它在Windows XP, Windows 2000, Windows 2003上分別跑在哪個進程裡面
XP:aspnet_wb.exe
2000:inetinfo.exe
2003:w3wp.exe
註:感謝下面網友的評論~~~~
本文只是整理了網上流傳的《程式員層級評鑑書》中的中級.NET程式員問題以及答案。
本文並不是真正用來鑒別程式員層級的,我相信大家心裡都有自己的標準。
本文部分經典問題,足夠寫一個系列的博文了。但是我水平有限,園內有好的文章連結,我都加上了。