- Virtual 關鍵字容許在派生類中重寫這些對象,默認狀況下,方法是非虛擬的,不能夠重寫非虛方法;c#
- virtual關鍵字不能夠與static、abstract、private、override一塊兒使用。windows
- Virtual關鍵字又是和override緊密不可分的,若是要實現Virtual方法就必需要使用override或new關鍵字(new和override產生的機理不一樣)。New和Override這兩個關鍵字是互斥的。不能夠同時使用;數組
- new : new關鍵字能夠在派生類中隱藏基類的方法安全
- virtual: Override關鍵字主要是提供派生類對基類方法的新實現,重寫的基類方法必須和Override的方法具備相同的簽名,相同的訪問修飾符服務器
總結:New關鍵字主要用來區別派生類和基類同名方法的選擇問題,經過隱藏基類方法,達到使編譯器調用正確的方法的目的。Override主要用來對基類的方法和虛方法進行重寫。框架
- 在notepad++ 中寫代碼,命名爲.cs結尾的文件:My.cside
- 對源文件運行C#命令行編譯器csc.exe ,編譯(csc My.cs)→ 運行(My.exe)工具
- 打開命令行的方法:一、cmd中運行批處理文件【C:\Program Files (x86)\Microsoft Visual Studio\Preview\Enterprise\Common7\Tools\VsDevCmd.bat】,而後再轉到d: 盤 csc My.cs ; 性能
二、在windows→ 菜單→ 開始→ 程序→ VS菜單→ 命令提示符窗口優化
注: cmd中,d:轉到d盤目錄下, cd MyNote轉到d盤的MyNote目錄下
using System; namespace Wrox { public class My { static void Main() { Console.WriteLine("Hello form Wrox"); Console.ReadLine(); } } }
- .NET框架由三部分組成。
* 內存管理和垃圾收集。
* 代碼安全驗證。
* 代碼執行、線程管理及異常處理。
- .NET Framework的核心是運行庫執行環境,稱爲(公共語言運行庫CLR或.NET運行庫),經過CLR控制下運行的代碼稱爲託管代碼
1. 將源代碼編譯爲Microsoft中間語言(IL)【低級語言,數字代碼,可快速轉換爲本地機器碼】
2. CLR把IL編譯爲平臺專用的代碼
- 優勢:
平臺無關性:編譯爲中間語言能夠得到.NET平臺無關性。
提升性能:IL老是即時編譯(稱爲JIT編譯),只編譯調用的那部分,代碼編譯過一次後,獲得的本地可執行程序就存儲起來,直到退出程序爲止,下次運行着代碼就不須要從新編譯了。
託管IL代碼幾乎和本地機器代碼的執行速度同樣快,JIT編譯器確切知道程序運行在什麼類型的處理器上,能夠利用該處理器提供的任何特性或特定的機器代碼指令來優化最後
的可執行代碼。
語言的互操做性:能將VB C# C++編譯爲中間語言,編譯爲中間語言的代碼能夠與其餘語言編譯過來的代碼進行交互操做。
* Visual Studio集成開發環境IDE.
* .NET兼容的編譯器(如:C#\ VB...).
* 調試器.
* 網站開發服務器技術,如ASP.NET 或WCF
BCL(base class library基類庫),是.NET框架的一個大類庫
C#編寫的代碼靠.NET Framework運行,結論:1.c#的體系結構和方法反映了.net基礎方法論 2.多數狀況下,c#特定語言功能取決於.NET的功能,或依賴於.NET基類。
1. 面向對象和使用接口:帶有類的單一繼承性,
2. 不一樣的值類型和引用類型:值類型變量之間存儲數據,引用類型變量僅存儲地址,對應的數據在該地址中找
3. 強數據類型化
4. 使用異常來處理錯誤
5. 使用特性(attribute)
- 內存泄漏:請求內存的代碼必須顯式通知系統它何時再也不須要該內存,很容易被遺漏,從而致使內存泄漏;
- .NET垃圾回收期是一個程序,用來清理內存。全部動態請求的內存都分配到堆上,隔一段時間.NET檢測到給定進程的託管堆已滿,須要清理時,就調用垃圾回收器。垃圾回收器處理目前代碼
中全部變量,檢查對存儲在託管堆上的對象的引用,沒有引用的對象被刪除。所以:不能保證何時會調用垃圾回收器:CLR決定須要它時就能夠調用它
- 減小運行應用程序的系統開銷,同時須要與其餘程序分離開來,但仍須要彼此通訊。
- windows經過地址空間把進程分隔開來,每一個進程有4GB的虛擬內存來存儲其數據和可執行代碼(4GB對應32位系統),每一個進程都會有不一樣的映射,虛擬地址空間塊映射的物理內存之間不重疊。
- 任何進程都只能經過制定虛擬內存中的一個地址來訪問內存,即進程不能直接訪問物理內存。
- 虛擬路徑:相對路徑, 物理路徑:硬盤的絕對路徑
- 程序集assembly是包含編譯好的、面向.NET Framework的代碼的邏輯單元,能夠存儲在多個文件中(動態程序集存儲在內存中);若是一個assembly存儲在多個文件中,其中就會有一個包含入口點的
主文件,該文件描述了程序集中的其餘文件。
- 可執行代碼和庫代碼使用相同的程序集結果。可是可執行的程序集包含一個主程序的入口點;而庫程序集不包含。
- 程序集的重要特徵:包含的元數據描述了兌銀代碼中定義的類型和方法,程序集也包含描述程序集自己的元數據。
- 塊:{語句1 ; 語句2;} 注意:{}後面沒有分號
- Console.Write(" ");
* Console.WriteLine(" Two sample integers are {0} and {1} .", 3, 6); 從0開始替代標記、替代值
* Console.WriteLine("Three integers are {1} , {0}, {1}", 3, 6); 輸出6, 3, 6 。注意標記位和標記值一一對應,標記位從0開始。
- 格式化字符串:
* Console.WriteLine(" The value: {0:C}.", 500); 格式化爲貨幣,$500.00
* Console.WriteLine(" {0, 10} ", 500); 正數右對齊,左邊補...
- 註釋:
* 單行//, 多行 /**/, 文檔註釋 ///
類(class)、結構(struct)、數組(array)、枚舉(enum)、接口(interface)
* 棧:是一個內存數組(桶,LIFO先進後出,後進先出)
# 存儲類型:某些類型變量的值、程序當前的執行環境、傳遞給方法的參數
# 棧的特徵:只能從棧頂插入(push入棧),刪除(pop出棧)
* 堆:是一塊內存區域,能夠分配大塊的內存用來存儲某類型的數據對象,能夠隨意插入和移除;當對象再也不被使用時,CLR的GC會自動回收
* 值類型:須要一段單獨的內存,存儲實際的數據,放在棧中
* 引用類型:須要兩段內存。第一段存儲實際的數據,放在堆中;第二段是一個引用,指向數據在堆中的存放的位置,放在棧中
* 總結:
簡單情形:值類型數據放在棧中;引用類型,實際數據始終放在堆中,引用放在棧中
複雜情形:引用類型的數據始終放在堆中;值類型對象或引用類型的引用部分能夠放在堆中,也能夠放在棧中,依賴於實際環境。
在賦值的時候,值類型是複製一份,新的和舊的在之後的操做中互不影響,而引用類型複製的只是地址,在之後的修改中,修改新的舊的也會受到影響。
* 爲數據分配內存:
ClassA a = new ClassA(); a只是用來保存引用分配在棧中,使用new纔是給實際數據分配內存【new運算符爲任意指定類型的實例分配內存並初始化內存】
變量類型 | 用途 | 存儲位置 | 自動初始化 |
本地變量 | 在方法的做用域保存臨時數據,不是類型成員 | 棧或堆和棧 | 否 |
字段 | 保存和類型或類型實例相關的數據,是類型成員 | 堆 | 是 |
參數 | 從一個方法到另外一個方法傳遞數據的臨時變量,不是類型的成員 | 棧 | 否 |
數組元素 | 同類數據項構成的有序集合的一個成員,能夠爲本地變量,也能夠類型的成員 | 堆 | 類成員是,本地變量否 |
* 靜態類型:變量的類型在編譯的時候肯定而且不能再運行時修改。
* dynamic:在編譯時對dynamic類型的全部信息打包,在運行時,對這些信息進行檢查,會拋出異常。
- var關鍵字(從等號右邊推斷出的實際類型的速記,並不改變C#的強類型性質)
* 只能用於本地變量,不能用於字段。
* 只能在變量聲明中包含初始化時使用(即var n = 10;)
* 一旦編譯器推斷出變量的類型,它就是固定且不能更改。
- 常量: const double PI = 3.1415; 聲明時初始化,在編譯時肯定類型,不能再賦值
- DateTime dt = DateTime.Now;
namespace EventTest { /// <summary> /// 委託總結:委託是一種類型,和類是平級,所以不存在重載一說 /// 系統提供的委託: /// 無返回值:Action無參數無返回值,Action<string, int>有參數無返回值 /// 有返回值:Func<int, int>最後一個都是返回值 public class SmarizeDelegate { public void Test() { MyDel del = (x, y) => { return x + y; }; //lamda表達式 del(10, 20); MyDel2<int> del2 = (x, y) => x + y; //lamada表達式帶return就要帶{},不帶return就能夠不帶{} del(10, 20); M1((x, y) => (x + y).ToString()); //Func有返回值委託,傳入兩個int,返回一個string Func<string, string, string> fn = M2(); //調用委託做爲返回值的 fn("你好", "徐攀"); } static void M1(Func<int, int, string> fn) //委託做爲方法參數類型 { Console.WriteLine(fn(10, 20)); } static Func<string, string, string> M2() //委託做爲方法返回值 { return new Func<string, string, string>((x,y) => x+y); } } public delegate int MyDel(int x, int y); //基本委託 public delegate T MyDel2<T>(T t1, T t2); //泛型委託 }