程序員要朝「內」和向「外」兩個方面擴展本身的知識和技能:
前端
內 —— 指的是編寫代碼的基本功、數據結構思想、設計模式等。程序員
「修內」四要素:面試
1. 深入理解面向對象編程思想;算法
2. 精通C#編程語言特色;數據庫
3. 熟悉設計模式的23種模式,理解各個模式UML圖編程
4. 瞭解軟件工程過程,掌握數據結構的概念和技術;設計模式
外 —— 指的是新技術的熱情、知識的廣度、注重擴展性等。瀏覽器
「修外」五要素:緩存
1. 對新技術的理解和遠見;服務器
2. 經過項目的實踐熟悉 DB 設計、SQL Server 或 Oracle 技術;
3. 清晰理解代碼實現方式、範例、以及.NET相關接口;
4. 理解 Web 2.0 理念、Blog/Wiki/RSS 架構、SOA 理念、軟件測試,瞭解網絡和其它操做系統;
5. 知道如何面對英語面試;
(P15) 工資 —— 必定要問清楚是稅前仍是稅後,這點不用多說。另外,還要問清楚,發多少個月。不少單位有年末雙薪,還有一些單位會發14-16個月不等。
(P15)
「五險一金」 —— 養老保險、醫療保險、失業保險、人身意外傷害保險、生育保險。「一金」指的是住房公積金。
有的單位公積金比例上得很是高,因此你工資扣得也不少,那意味着公司交的錢更多,而一旦買房時,這些錢都是你本身的。因此,這部分收入不能忽視。
有些單位還會向你提供補充醫療保險、補充養老保險、補充意外保險、住房無息貸款或經濟適用房等,也要問清楚。
(P16) 關於加班,國家有規定:若是周6、週日加班的話,能夠得到正常工資2倍的加班費;若是是五1、十一這樣法定的假日加班的話,能夠得到正常工資3倍的加班費。
(P29) 事情都是人作出來的,關鍵是人。
(P30) 正確的作法是和那些比你強的人打交道,看他們是怎麼想的、怎麼作的,學習他們,而後最終提高本身的能力纔是最重要的。
(P35) 語言有「無類型」、「弱類型」和「強類型」3種:
1. 「無類型」 —— 不檢查,甚至不區分指令和數據;
2. 「弱類型」 —— 檢查很弱,僅能嚴格地分指令和數據;
3. 「強類型」 —— 嚴格地在編譯期進行檢查;
(P36) GAC —— Global Assembly Cache (全局應用程序集緩存),它解決了幾個程序共享某一個程序集的問題。
(P37)
值類型的實例一般是在線程棧上分配的(靜態分配),可是在某些情形下能夠存儲在堆中。
引用類型的對象老是在進程堆中分配(動態分配)。
引用類型和值類型都繼承自 System.Object 類,不一樣的是,幾乎全部的引用類型都直接從 System.Object 繼承,而值類型則繼承其子類,即直接繼承 System.ValueType 。
(P38) 全部的值類型都是密封的,因此沒法派生出新的值類型。
(P39) 引用類型能夠包含 Null 值, 值類型不能。
(P40)
引用類型在棧中存儲一個引用,其實際的存儲位置位於託管堆。
值類型(不支持多態)適合存儲C#應用程序的數據,而引用類型(支持多態)應該用於定義應用程序的行爲。
(P43) 裝箱就是將值類型轉換爲引用類型的過程,並從棧中搬到堆中。而拆箱就是把引用類型轉換爲值類型。
(P45) DateTime 爲 Struct 類型。
(P47)
關鍵字 const (靜態常量):
1. 在編譯期間解析的常量;
2. 必須在聲明同時就初始化;
3. 既可用來修飾類中的成員,也可修飾函數體內的局部變量;
關鍵字 static readonly (靜態常量):
1. 在運行期間解析的常量;
2. 既能夠在聲明時初始化,也能夠在構造器中初始化;
3. 只能夠用於修飾類中的成員;
(P51)
問: 定製的異常類應該繼承哪一個類? 應包含哪些構造函數?
答: 定製的異常類應從 Application.Exception 派生。按照約定,異常名應以 Exception 結尾, 應包含 Exception 基類定義的3個公共構造函數:
1. 默認的無參構造函數;
2. 帶一個字符串參數(一般是消息)的構造函數;
3. 帶一個字符串參數和一個 Exception 對象參數的構造函數;
(P60)
「==」判斷符號左右兩個 Object 是否指向統一內存地址;
「Equals()」判斷兩個 Object 是否同樣 (全部成員值同樣);
(P63)
在.NET Framework 中,由3種序列化機制:二進制、XML和簡單地向訪問協議(SOAP),它們的優缺點以下:
1. 二進制序列化的最大優勢是: 類型數據能夠準確地表示出來。由於二進制序列化對象的公有和私有成員,因此在反序列化的時候能夠忠誠地重建出該對象的狀態;
2. XML 只序列化對象的公有屬性和字段。在 XML 序列化時,私有字段和其它實例化對象就失去了;
3. XML 和 SOAP 是開放標準,具備很好的移植性;
(P72) Random r = new Random(unchekced(int)DateTime.Now.Ticks));
(P73)
過程式編程語言爲: 程序 = 算法 + 數據;
面向對象編程語言爲: 程序 = 對象 + 消息;
(P76) 抽象類或者包含私有構造函數的類都不能實例化。
(P79) internal protected 的語意應該是 「internal || protected」
(P80) 棧的訪問速度比堆要快,但棧的資源有限。
(P88) 虛函數的目的就在於實現多態性。
(P92) 若是沒有寫靜態構造函數,而類中包含帶有初始值設定的靜態成員,那麼編譯器會自動生成默認的靜態構造函數。
(P95)
「覆蓋 (Override)」 —— 指子類從新定義父類的虛函數的作法;
「重載 (Overload)」 —— 指容許存在多個同名函數,而這些函數的參數表不一樣(或許參數個數不一樣,或許參數類型不一樣,或許二者都不一樣);
重載只是一種語言特性,與多態無關,與面向對象也無關;
封裝能夠隱藏實現細節,使得代碼模塊化;
繼承能夠擴展已存在的代碼模塊(類);
它們的目的都是爲了 —— 代碼重用
多態是爲了實現另外一個目的 —— 接口重用;
「接口是公司最有價值的資源。設計接口比用一堆類來實現這個接口更費時間,並且接口須要耗費更昂貴的人力的時間」。
繼承的爲重用代碼而存在的理由已經愈來愈薄弱,由於「組合」能夠很好地取代繼承的擴展示有的代碼的功能,並且「組合」的表現更好(至少能夠防止「類爆炸」)。繼承的存在很大程度上是做爲「多態」的基礎,而非擴展示有代碼的方式。
(P99)
接口:
—— 從廣義上說,凡是一個類提供給外部使用的部分均可以被稱爲接口。廣義接口的真正意義是在類的繼承中體現多態的功能,這種接口又被稱爲抽象類接口。
—— 從狹義上說,接口是指特定的函數集合,通常是用 Interface 聲明的,它表示一個方法集合,這個集合被稱爲一個命名接口。
從上述認識來看,接口其實是結合着多態而來的,它的最大的任務就是實現多態,而多態又是面向對象最精華的理論。掌握了多態,也就掌握了面向對象的精髓。但掌握多態必須先理解和掌握接口,只有充分理解接口的定義,才能更好地應用多態。
(P104)
在C#中,new 關鍵字可用做運算符、修飾符或約束。
new 修飾符和 override 修飾符不可同時用在一個成員上,由於這兩個修飾符在含義上相互排斥。
(P108) 若是想調用子類的 new 方法,用子類的句柄(絕對不能用基類句柄)來調用。
(P110) 在構造函數中,經過 this 能夠調用同一 class 中別的構造函數。
(P112)
子類被構造時必定會先調用父類的構造函數,但能夠用 base 關鍵字選擇調用哪一個構造函數。
決定調用哪個,但不能哪一個都不調用(至少選一個)。若是不指定的話,通常會調用無參數的構造函數,由於這是一個類的默認的構造函數。
(P113) 抽象類容許包含抽象成員,但這不是必需的(能夠容許一個抽象類中沒有任何抽象成員),抽象類中能夠有非抽象方法。
(P116) 接口中的接口成員能夠是方法、屬性、事件和索引器。
(P188) abstract 修飾符不能夠和 static、virtual 和 sealed 修飾符一塊兒使用,可是能夠和 override 修飾符一塊兒使用。
(P123) 顯式爲接口的方法指定 public 修飾符是非法的。
(P127) 委託在編譯的時候肯定會編譯成類。
(P128) 委託是一個類,它定義了方法的類型,使得能夠將方法當作另外一個方法的參數來進行傳遞,這種將方法動態地賦給參數的作法,使得程序具備更好的可擴展性。
(P131) 聲明一個事件相似於聲明一個進行了封裝的委託類型的變量。
(P145)
1. NLR : 前序遍歷 (Preorder Traversal) —— 訪問結點的操做發生在遍歷其左右子樹以前,即根左右;
2. LNR : 中序遍歷 (Inorder Traversal) —— 訪問結點的操做發生在遍歷其左右子樹之間,即左根右;
3. LRN : 後序遍歷 (Postorder Traversal) —— 訪問結點的操做發生在遍歷其左右子樹以後,即左右根;
(P146)
「滿二叉樹」 —— 對於全部結點都達到最大的二叉樹;
「徹底二叉樹」 —— 葉子結點僅在層次最大的兩層出現,對於任意一結點,左子樹高度只等於右子樹高度或者右子樹高度加一;
(P153) System.Text.Encoding.Default.GetBytes(strTmp).Length —— 裏面的 Default 屬性,在默認狀況下,英文字母用一個字節表示,漢字用雙字節表示。
(P160)
在待排序的文件中,若存在多個關鍵字相同的記錄,通過排序後這些具備相同關鍵字的記錄之間的相對次序保持不變,該排序方法是穩定的;若具備相同關鍵字的記錄之間的相對次序發生變化,則這種排序方法是不穩定的。
穩定的排序 ——
排序名稱: 氣泡排序 (Bubble Sort)
時間複雜度: 最差、平均都是 O(n2);最好是 O(n)
空間複雜度: 1
排序名稱: 雞尾酒排序 (Cocktail Sort) (雙向的冒泡排序)
時間複雜度: 最差、平均都是 O(n2);最好是 O(n)
空間複雜度: 1
排序名稱: 插入排序 (Insertion Sort)
時間複雜度: 最差、平均都是 O(n2); 最好是 O(n)
空間複雜度:1
排序名稱: 歸併排序 (Merge Sort)
時間複雜度: 最差、平均、最好都是 O(nlogn)
空間複雜度: O(n)
排序名稱: 桶排序 (Bucket Sort)
時間複雜度: 最差、平均、最好都是 O(n)
空間複雜度: O(k)
排序名稱: 基數排序 (Radix Sort)
時間複雜度: 最差、平均、最好都是 O(dn) (d是常數)
空間複雜度: O(n)
排序名稱: 二叉樹排序 (Binary Tree Sort)
時間複雜度: 最差、平均、最好都是 O(nlogn)
空間複雜度: O(n)
排序名稱: 圖書館排序 (Library Sort)
時間複雜度: 最差、平均、最好都是 O(nlogn)
空間複雜度: (L+&)n
不穩定的排序 ——
排序名稱: 選擇排序 (Selection Sort)
時間複雜度: 最差、平均都是 O(n2)
空間複雜度: 1
排序名稱: 希爾排序 (Shell Sort)
時間複雜度: 最差、平均、最好都是 O(nlogn)
空間複雜度: 1
排序名稱: 堆排序 (Heap Sort)
時間複雜度: 最差、平均、最好都是 O(nlogn)
空間複雜度: 1
排序名稱: 快速排序 (Quick Sort)
時間複雜度: 平均是 O(nlogn); 最壞的狀況下是 O(n2)
空間複雜度: O(logn)
(P165) 應用交換排序基本思想的主要排序方法有: 冒泡排序和快速排序。
(P183) 做爲設計者,應該擁抱變化、利用變化,而不是逃避變化。
(P192)
MVC (Model / View / Controller) 模式是一種使用的較多的設計模式。 MVC 包括了類對象: Model 是應用對象;View是它在屏幕上的表示; Controller 定義用戶見面對用戶輸入的響應方式。
1. 模型 (Model):是應用程序的主體部分,模型表示業務數據,或者業務邏輯;
2. 視圖 (View): 是應用程序中用戶界面相關的部分,是用戶看到並與之交互的界面;
3. 控制器 (Controller):工做就是根據用戶輸入控制用戶界面數據顯示和更新 Model 對象的狀態;
(P201)
類與類之間存在如下關係:
1. 泛化 (Generalization)
2. 關聯 (Association)
3. 依賴 (Dependency)
4. 聚合 (Aggregation)
泛化 —— 指類與類之間的繼承關係、接口與接口之間的繼承關係或類對接口的實現關係;
依賴 —— 指對兩個相對獨立的對象,當一個對象負責構成另外一個對象的實例,或者依賴另外一個度喜好那個的服務時,這兩個對象之間主要體現爲依賴關係;
關聯 —— 指對於兩個相對獨立對象,當一個對象的實例與另外一個對象的一些特定實例存在固定的對應關係時,這兩個對象之間爲關聯關係;
聚合 —— 指當對象 A 被加入到對象 B 中,成爲對象 B 的組成部分時,對象 B 和 對象 A 之間爲聚合關係;
聚合是關聯關係的一種,是較強的關聯關係,強調的是總體與部分之間的關係;
關聯與聚合的區別:
1.
關聯關係所涉及的兩個對象是處在同一個層次上的;
聚合關係所涉及的兩個對象是處於不平等的層次上,一個表明總體、一個表明部分;
2. 對於具備聚合關係的兩個對象,總體對象會制約它的組成對象的生命週期。部分類的對象不能單獨存在,它的生命週期依賴於總體類的對象的生命週期,當總體消失,部分也就隨之消失;
(P222)
一個進程至少包含一個線程;
當一個程序開始運行時,它就是一個進程。進程包括運行中的程序和程序所使用到的內存和系統資源;
(P227)
做業調度算法:
1. 先來先服務;
2. 輪轉法;
3. 多級反饋隊列算法;
4. 優先級法;
5. 最短做業優先法;
6. 最高響應比優先法;
進程調度算法:
1. 先進先出算法;
2. 最短 CPU 運行期優先調度算法;
3. 輪轉法;
4. 多級反饋隊列;
(P228)
「sleep()」 —— 是使線程中止一段時間的方法。在 sleep 時間間隔期滿後,線程不必定當即恢復運行。
「wait()」 —— 是線程交互時,若是線程對一個同步對象 X 發出一個 wait 的調用,該線程會暫停執行,被調用對象進入等待狀態,知道被喚醒或等待時間到。
(P238)
「存儲過程」 —— 是用戶定義的一系列 SQL 語句的集合,涉及特定表或其它對象的任務,用戶能夠調用存儲過程;
「函數」 —— 一般是數據庫已定義的方法,它接受參數並返回某種類型的值,而且不涉及特定用戶表;
「事務」 —— 做爲一個邏輯單元執行的一系列操做,一個邏輯工做單元必須有4個屬性,成爲 ACID (原子性、一致性、隔離性和持久性) 屬性, 只有這樣才能成爲一個事務;
(P275)
「單項綁定」 —— <%# Eval("username") %>
「雙向綁定」 —— <%# Bind("title") %>
(P276) 在數據綁定控件的 EditItemTemplate 或 InsertItemTemplate 中要使用 Bind 函數。
(P278)
ASP.NET 頁面在觸發各個子控件的事件以後,會遞歸調用控件的 OnPreRender , 而後遞歸地將控件的 ViewState 序列化成一個字符串,最後遞歸調用控件的 Render 輸出結果。
在 DataBind 的事件中,ItemCreated 和 ItemDataBind 是尤其重要而且常常要用到的兩個事件。
ItemCreated 事件在 DataGrid 建立表格時觸發。
ItemDataBound 事件在數據綁定到相應的行後觸發。
(P283) Session 在服務器和客戶端各保留一個副本,關閉瀏覽器與否與 Session 是否存在沒有任何關係。
(P284) Session 機制可能須要藉助於 Cookie 機制來達到保存表示的目的,但實際上還有其它選擇。
(P285)
「Application」 —— 是公共的,全部人都能看到;
「Session」 —— 是私有的,每一個客戶端都存在一個不一樣的 Session 生存期;
「Cookie」 —— 是保存在本機的文件,記錄短小的信息,除非 Cookie 過時,不然會一直存在;
「ViewState」 —— 相似於 ASP 中的 Hidden 控件,用來記錄頁面中控件的狀態,主要在頁面間傳遞信息時用;
「Cache」 —— 是緩存,用來記錄已經執行過的一些數據,好比讀取數據庫目的是加速顯示,減小服務器的負擔,過時時間也是能夠本身設定的;
(P288) XML 註釋 : <!-- -->
(P288)
ASP.NET頁面之間傳遞參數:
1. URL 連接地址傳遞 —— QueryString
2. Post 方式 —— Request.Form["***"]
3. Session 傳遞
4. Application 傳遞
5. Server.Transfer 傳遞
(P290)
GET 請求:
1. 利用一個問號「?」表明 URL 地址的結尾數據參數的開端;
2. 後面的參數每個數據參數以 「名稱 = 值」的形式出現;
3. 參數與參數之間利用一個鏈接符「&」來區分;
(P291)
防盜鏈:
1. 檢查Refer;
2. 爲資源文件添加數據簽名;
3. Session驗證;
(P288) XML Web Service 與 .NET Remoting
1.
名稱: XML Web Service
容易操做: 容易
跨平臺: 是
充分利用 .NET Framework 功能:不充分
精確傳遞數據格式: 不精確
支持狀態: Stateless
對象做業模式: 無
支持通訊協議: HTTP
執行效率: 低
2.
名稱: .NET Remoting
容易操做: 較難
跨平臺: 否
充分利用 .NET Framework 功能:充分
精確傳遞數據格式: 精確
支持狀態: Stateful 或 Stateless
對象做業模式: 豐富(單次呼叫、單一對象、前端啓用)
支持通訊協議: HTTP、TCP(可擴充)
執行效率: 高
(P304)
「Finalize()」 —— 用於隱式釋放資源;
「Dispose()」 —— 用於顯式釋放資源;
(P311) 在面試面前,面試者應對應聘公司有所瞭解。好比公司的規模、業務、將來發展等。對公司文化理解是否深入,是你超出其餘應聘者的一個亮點。
(P366) 知識是用來用的,不是用來當擺飾唬人的。