( 需註意程度:紅>粗體>下劃線,藍色:我的疑問 ) 老師的引言 [師]對待一種新語言的關註點 數據類型定義(python不用定義) 語法 JAVA兩大優勢 面相對象:比C++簡單 跨平臺 開源:造就了很多免費的東西 每個button其實就是類的實例 找工作一定要有一技之長 面試內容: 大公司:基礎 ...
( 需註意程度:紅>粗體>下劃線,藍色:我的疑問 )
- 老師的引言
- [師]對待一種新語言的關註點
- 數據類型定義(python不用定義)
- 語法
- JAVA兩大優勢
- 面相對象:比C++簡單
- 跨平臺
- 開源:造就了很多免費的東西
- 每個button其實就是類的實例
- 找工作一定要有一技之長
- 面試內容:
- 大公司:基礎:C語言、數據結構
- 小公司:技術:C#、Java
- 數據傳遞(不確定正誤):
- 多數據傳遞:靜態類
- 單數句傳遞:構造函數
- 看懂書了再寫代碼
- [師]對待一種新語言的關註點
- 1 C#語言概述
- C#:
- 完全面向對象,設計一個程式就是設計一個或多個類
- 最長編寫的3種應用類型
- 控制台程式
- 窗體程式:窗體為.cs文件
- web應用程式
- 代碼:
- 托管代碼:
- 在CLR控制下運行
- 不能寫記憶體
- 是安全的
- 非托管代碼:
- 由操作系統直接運行
- 可以使用指針操作記憶體(所以指針是在操作記憶體)
- 不安全的
- 托管代碼:
- .NET Framework
- FCL(Framework Class Library):全面的類庫,包含大量處理常見的低級編程操作;由命名空間組成見p4-5
- CLR(公共語言運行庫):操作系統頂層,管理程式的執行,總的來說,包括:無用存儲單元的回收,代碼驗證和類型安全,代碼訪問安全
- CLS(Common Language Specification公共語言規範):定義了所有編程語言必須遵守的共同標準,語法
- CTS(Common Type System通用類型系統):定義了一套預定義數據類型。如:VB中的integer和C#中的int,在編譯後都映射為System.Int32,實現了不同語言數據類型的統一,從而實現跨語言功能
- 運行應用程式代碼的過程
- C#與. NET Framework的關係
- Visual C#集成開發環境
- 菜單
- 工具欄:菜單中常用的按鈕放到這裡了,可在“視圖|工具欄”自定(我也要養成自定義工具欄的思維)
- 解決方案管理器:
- 解決方案名稱。解決方案包含項目。.slh可以打開整個項目
- 項目:包含於解決方案
- 引用:庫函數,指出程式引用的命名空間
- program.cs是代碼文件。所有C#代碼的源文件都是.cs(即C Sharp)為拓展名
- 編輯器設置:在 工具|選項(雖然是在菜單的某一選項,卻包含了整個軟體的設置)
- 項目的構成(目錄在 資源管理器 顯示)
- properties:
- 引用:指出程式引用的命名空間
- Program.cs
- namespace關鍵字的作用(using某些方面類似於c的#include):
- 組織代碼
- 分類管理
- 包含多個類
- namespace關鍵字的作用(using某些方面類似於c的#include):
- 其他
- Main()為程式入口
- 數據類型
- 值類型:直接存儲所包含的值(結構體是值類型),在棧空間分配
- 引用類型:存的是指針,指向它所要存儲的值(字元串是引用類型),其對象在堆空間分配
- C#:
- 2 C#程式設計基礎
- 變數的四個理解層面
- 變數的名稱:和該記憶體空間綁定在一起,對變數名稱的操作就是對記憶體空間的操作,也就是說程式員通過變數來使用電腦的記憶體空間。從系統的角度看,變數就是程式中的存儲單元,它既表示這塊記憶體空間的地址,也表示這塊記憶體空間中存儲的數據。
- 變數的值
- 變數的數據類型:決定了可容納什麼樣的值,取值範圍,什麼樣的操作可執行
- 變數的作用域和生命周期
- 數據類型:1值類型變數的記憶體開銷小、訪問速度快; 2引用類型變數記憶體開銷大、訪問速度稍慢; 3無論值類型變數還是引用類型變數,都是在棧空間中分配對應的存儲空間,所不同的是,引用類型變數所指的對象是在托管堆上分配記憶體空間
- 值類型
- 簡單類型:[師]類型轉換是一定要考慮溢出
- 結構類型:註意結構體是值類型
- 枚舉類型
- 引用類型
- 類
- string類:@ 字元串 為嚴格字元串,其中無轉義字元
- 介面
- 數組
- 委托
- 類
- 值類型
- 堆與棧:
- 棧:系統管理所有的棧空間
- 堆:程式可在堆中保存數據,但在c#中不能顯式地刪除他們,因為我們沒有指針,我們只管創建類的實例用就好了,CLR幫我們處理無用的對象
- 其他
- 拆箱和裝箱:即值類型和引用類型的轉換
- 結構類型:實際問題中,一組數據往往具有不同的數據類型,結構類型可以存儲多個不同類型的數據(我:分類是人類認識世界的方式,所以這個也是為了歸類,為了理清人類的思緒?),結構類型常規使用就是賦值和訪問
- 枚舉類型:用符號代替數據,提高程式的可讀性。如用X.red表示紅色。枚舉類型常規使用就是賦值和訪問
- 運算符:
- new:創建對象(我:這也當作運算符看?那什麼不是運算符呢?)
- checked:啟用溢出檢查
- 常用類:1 C#是一種純面向對象語言,使用類和結構體來實現數據類型,而對象是給定數據類型的實例;2 C#中一切都是對象,例如,int數據類型就是一個類,它提供了相應的屬性和方法,int x=3這條代碼,int為類,x為對象。
- string類:
- 格式化字元串:Format()。有的函數庫中就有了,不要再造輪子了
- Math類:要寫計算器,根本不用自己實現那些複雜演算法,直接用這些函數就可以了,一定要有這種思想,不要重覆造輪子
- Convert類:值類型(?僅值類型嗎?書寫錯了?string也可以的啊)間的轉換
- string類:
- 問題:類語言和非類語言編譯器的實現有什麼區別?
- 問題:靜態方法和動態方法有什麼區別,為什麼要做這種區分?
- 變數的四個理解層面
- 3 C#控制語句
- [師] if{ if..... }else{ if..... }如果有很多判斷,寫在黑體的if不易讀,寫在劃線的if更易讀
- 迴圈控制語句:for通常用於已知迴圈次數(for只能用於已知迴圈次數,這句話是錯的)
- [師] 我(俞定國老師)當年是紙上寫一遍,腦子驗證,然後敲在電腦
- break,continue用於跳出迴圈(故寫在if中,跳出的是if外的迴圈)
- 閱讀代碼的方法:閱讀代碼只看關鍵的,細節都忽略
- while後的表達式為邏輯表達式或關係表達式
- 4 數組和集合
- [師] c的強勢在於
- 指針
- 位運算:直接到低層記憶體的運算
- [師]1先寫各種代碼,然後向上向下拓展。2代碼要分塊,也就是把步驟和功能分割開
- 數組
- 數組是引用類型,通過一個名稱來存取,所有值放在記憶體的一段連續空間,為了區分不同的值,添加了一些索引或下標。
- 集合和數組不同的地方在於:可動態增減
- 通常把二維數組叫做矩陣
- 數組的動態初始化(new)和靜態初始化,只不過是編譯時間不同,結果是一樣的
- foreach(var 迭代變數 in 數組或集合)
- 有些情況為了簡單,數組下標中的0總是不用
- Array類:所有數組的抽象基類。在C#中,數組實際上是對象,而不像C/C++中那樣的可定址連續記憶體區域
- (我:對象不是 可定址連續記憶體區域 ?)(我:什麼是對象,什麼是可定址連續記憶體區域)。
- 靜態方法+動態方法
- ArrayList類 [師]:重點掌握,不像C需要自己控制
- Array類的優化版本,容量或元素個數不像Array是固定的
- 可存放多重數據類型,其用的數據類型是Object
- Array是多維的,ArrayList是一維的
- 均非靜態方法
- List<T>類:是ArrayList類的泛型等效類 [師]:重點掌握,不像C需要自己控制
- 數據類型是指定的
- 均為非靜態方法
- 這個有一個方法叫ForEach可以對每個元素執行指定操作
- 數組、List和ArrayList的區別
- 數組在記憶體中是連續存儲的,所以它的索引速度是非常的快,而且賦值與修改元素也很簡單,但是數組也存在一些不足的地方。比如在數組的兩個數據間插入數據也是很麻煩的,還有我們在聲明數組的時候,必須同時指明數組的長度,數組的長度過長,會造成記憶體浪費,數組和長度過短,會造成數據溢出的錯誤。這樣如果在聲明數組時我們並不清楚數組的長度,就變的很麻煩了。C#中最先提供了ArrayList對象來剋服這些缺點
- ArrayList是數據存儲和檢索的專用類,大小是按照其中存儲的數據來動態擴充與收縮的。因為ArrayList會把所有插入其中的數據都當作為object類型來處理。這樣,在我們使用ArrayList中的數據來處理問題的時候,很可能會報類型不匹配的錯誤,也就是說ArrayList不是類型安全的。既使我們保證在插入數據的時候都很小心,都有插入了同一類型的數據,但在使用的時候,我們也需要將它們轉化為對應的原類型來處理。這就需要裝箱與拆箱的操作,會帶來很大的性能損耗。(該類的方法索引均從0開始)
- 所以在C#2.0後出現了泛型的概念。List<T>類 在聲明List集合時,我們同時需要為其聲明List集合內數據的對象類型。通過允許指定泛型類或方法操作的特定類型,泛型功能將類型安全的任務從您轉移給了編譯器。不需要編寫代碼來檢測數據類型是否正確,因為會在編譯時強制使用正確的數據類型。減少了類型強制轉換的需要和運行時錯誤的可能性。泛型提供了類型安全但沒有增加多個實現的開銷。(List list = new ArrayList();這句創建了一個ArrayList的對象後把上溯到了List。此時它是一個List對象了,有些ArrayList有但是List沒有的屬性和方法,它就不能再用了。 而ArrayList list=new ArrayList();創建一對象則保留了ArrayList的所有屬性。 )
- 考試前要看一遍正確的定義數組的幾種方式,否則會混淆!考後這句話就刪除掉吧
- [師] c的強勢在於
- 5 面向對象程式設計
- [師]:面向對象中,有20%的知識常用,就像搭積木,你只需要搞定用的東西
- 對象之間通過一定的“相互操作”傳遞信息([師金哲凡]:傳遞消息是一種設計概念,落實到語言上就是函數調用),在消息的作用下完成特定功能。
- 封裝:尚未理解
- C#實現運行時多態性的基礎是動態方法調度,它是一種在運行時而不是在編譯期調用重載方法的機制。(不能完全理解後面這句話的意義)
- 從電腦語言角度來說,類是一種數據類型,而對象是具有這種類型的變數
- 通常用數據成員模擬現實世界事物的特性,通常用函數成員模擬現實世界的功能和操作
- 無修飾符時,預設為私有的
- 類和結構類型很相似,但也有不同,主要差異如下
- 對象瀏覽器和類圖方便程式員進行面向對象的程式設計
- 對象引用變數在棧空間分配,實例在堆空間分配
- 沒有引用變數指向的堆空間會被CLR收回
- using 命名空間,註意using不是加的類,而是命名空間
- 當定義類對象時,構造函數會被自動執行,當類對象銷毀時,析構函數會自動執行
- 自己寫了含參數構造函數,記得自己寫一個預設函數
- 靜態成員屬於類所有,非靜態成員屬於類的對象所有。提出靜態成員概念的目的是為瞭解決數據共用的問題
- 靜態和非靜態的存儲方式
- 靜態構造函數的特點:不會繼承,在所有的構造函數中最先被執行
- 問題:屬性是強化的欄位,弱化的方法,right?
- Main()是每個C#應用程式入口,在啟動時由公共語言運行庫調用
- 方法中的參數是保證不同方法間互動的重要“橋梁”,方便用戶對數據進行操作
- 方法的參數類型(註意參數是值還是引用就容易多了)
- 值類型
- 在棧中為形式參數分配空間
- 計算實參的值,並把該值複製給形式參數
- 註意體會這張圖和代碼
- 引用參數
- 不會在棧上分配空間
- 形參將作為實參的別名
- 註意體會這張圖和代碼
- 輸出參數
- 也不開闢新的記憶體區域
- 參數數組
- 可選參數
- 值類型
- this關鍵字:對當前實例的引用
- 對象的複製:非靜態方法Object.MemberwiseClone()來實現
- 淺複製:共用除String的所有引用成員實例
- 深複製:需自己創建新的引用類型,C#並沒有嵌入在語言中
- 嵌套類:未細看,用時看p119-p121
- 索引器:類似於屬性,不同在於訪問器採用參數。索引類型並不限製為整數。它的引入為了使程式更加直觀、易於理解。索引器的聲明、使用如下:
- 委托:即函數指針,不同於c/c++,可以與多個方法關聯在一起,可以把委托對象看成一系列方法,使用. +=委托對象 .增加方法,委托封裝的多個方法都會被一次性一起調用。聲明與使用:
- 事件:委托(函數指針)是事件的基礎。在事件通信中,事件源類不知道哪個對象或方法將接受到(處理)它引發的事件,所需要的是在源和接收方之間存在一個媒介(或類似指針的機制)。使用與分析見下圖:
- 犯錯截圖:
- 6 繼承和介面設計(習題尚未做)
- 繼承
- 為了對現實世界中的層次結構進行模型化,面向對象的程式設計技術引入了繼承的概念
- 派生類對象也是基類的對象,所以基類的引用變數可以引用基派生類對象(註意勿反,這兩句話句話和一般的世界規律有點不同)
- 除了構造函數和析構函數,派生類隱式地繼承了基類所有成員
- 基類的private不能被繼承(
- 繼承