一個程序至少有一個進程,一個進程至少有一個線程。線程的劃分尺度小于進程,使得多線程程序的并發性高。
這個解釋很形象:http://m.survivalescaperooms.com/laozhao8/p/3574737.html
Windows服務可以在計算機啟動時自動啟動,可以暫停和重新啟動而且不顯示任何用戶界面。
EXE 可執行程序通常有一個用戶界面,Console或 GUI,通常由用戶來啟動或停止。
以32位操作系統為例,最大尋址是4G(含虛擬內存),是通過2的32次方計算的; 當物理內存小于4G時,進程訪問的內存量隨著虛擬內存的增加而增加,直到4G; 4GB內存實際上包含了程序的所有部分--包括可執行代碼,代碼加載的所有dll,以及程序運行時使用的所有變量的內容。這個4GB內存稱為虛擬地址空間,或虛擬內存。
對設計有明顯影響的有2點:
在.NET中區別最明顯的是int的使用,在32位下和64位下存儲的數據不一樣(int 4個字節32位, 8個字節64位);另外一個是編譯的程序為X86則可在32、64位下同時運行。
DLL中雖然包含了可執行代碼卻不能單獨執行,而應由Windows應用程序直接或間接調用。EXE就不用說了吧~
強類型是指盡量早的檢查變量的類型, 通常在編譯的時候就檢查.
弱類型是指盡量推后對變量類型的檢查, 通常在運行時檢查。
到底哪個好? 其實各有各的好, 像ruby, javascript, 都屬于week-typing, 好處是寫代碼的時候比較快. C#屬于strong-typing, 好處是如果變量類型不對的話, 編譯不會通過, Visual Studio 還會有提示. 至于寫代碼的速度上講, 自從C# 3.0以來, 使用var來定義變量, 簡單了很多。
PID全稱是 PRocess Identifier, 就是進程的一個號碼, 通常當系統哪個程序不聽使喚的時候, 可以用它來把這個程序關閉. 而且Debug的時候, 也有用。
TCP/IP端口可以被多少個進程分享
1 Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);2 Socket socket2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);3 socket1.Bind(new IPEndPoint(IPAddress.Parse(”127.0.0.1″),8235));4 socket1.Listen(10);5 socket2.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);6 socket2.Bind(new IPEndPoint(IPAddress.Parse(”127.0.0.1″), 8235));7 socket2.Listen(10);8 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 發生在不同進程之間。
.NET remoting
Xp : aspnet_Wp.exe
Windows 2000 : inetinfo.exe
Windows 2003 : w3wp.exe
一般使用DateTime.TryParse解析。
PDBs是源碼編譯文件-全稱Program Database,這個文件主要會存儲對應模塊(dll或者exe)內部的所有符號,以及符號對應的地址、文件名和行號。調試的時候應用程序和源文件之間的一個橋梁。
一種代碼復雜度的衡量標準。
可以用來衡量一個模塊判定結構的復雜程度,數量上表現為獨立現行路徑條數,也可理解為覆蓋所有的可能情況最少使用的測試用例數。圈復雜度大說明程序代碼的判斷邏輯復雜,可能質量低且難于測試和維護。程序的潛在風險和高的圈復雜度有著很大關系。
lock 關鍵字可確保當一個線程位于代碼的臨界區時,另一個線程不會進入該臨界區。 如果其他線程試圖進入鎖定的代碼,則它將一直等待(即被阻止),直到該對象被釋放。
1 public class MySingleton { 2 3 private static object myLock = new object(); 4 5 private static volatile MySingleton mySingleton = null; 6 7 private MySingleton() { 8 9 }10 11 public static MySingleton GetInstance() {12 13 if (mySingleton == null) { //第一次檢查14 15 lock (myLock) {16 17 if (mySingleton == null) { // 第二次檢查18 19 mySingleton = new MySingleton();20 21 }22 23 }24 25 }26 27 return mySingleton;28 29 }30 31 }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類型的引用對象
引用類型
把不參與序列化的對象標注出來,只序列化有用的數據,而不是序列化整個對象。去除沒必要的數據冗余,和提升序列化時
新聞熱點
疑難解答