您當前位置:
首頁 >
互聯網 > C#本質論(第3版)筆記
C#本質論(第3版)筆記
來源:程序員人生 發布時間:2014-11-19 08:41:23 閱讀次數:2313次
C#本質論(第3版)
跳轉至:
導航、
搜索
目錄
- 1
C#概述
- 2
數據類型
- 3
運算符和控制流
- 4
方法和參數
- 5
類
- 6
繼承
- 7
接口
- 8
值類型(struct)
- 9
合式類型
- 10
異常處理
- 11
泛型
- 12
拜托和Lambda表達式
- 13
事件
- 14
支持標準查詢運算符的集合接口(C# 3.0引入的新的Enumerable類擴大)
- 15
LINQ(有了LINQ,你不再需要ORM;你也不需要編寫集合處理過濾類的代碼;簡潔優雅地實現數據查詢挑選處理的功能)
- 16
自定義集合
- 17
反射、特性和動態編程
- 18
多線程
- 19
同步和其他多線程處理模式(TPL)
- 20
平臺互操作和不安全的代碼
- 21
附錄:CLI
- 22
附錄:下載和安裝(.NET和Mono)
- 23
附錄:System.Collections.Concurrent
- 24
附錄:C# 2.0 3.0 4.0主題
|
C#概述
- C#關鍵字:... add* alias* ascending* base by* descending* dynamic* equals* from* get* global* group* let* var* value* yield* ...
- e.g. 1.0 --> 2.0: yield return
- 將關鍵字作為局部變量使用:@return
- CIL和ILDASM
數據類型
- decimal:1.2345m
- @" ... /// .... "
- int? a = null; //C# 2.0
- int[,] cells;
- .Length 屬性
- .GetLength(0) 獲得第1維的長度
- 交錯數組:int[][] cells2; //!
運算符和控制流
- foreach(char c in str){ ... }
- switch-case:支持字符串常量?C#不允許fall-through?但case可以連起來寫
- C# 2.0 空接合:expr1?? expr2;(這是?:的某種簡化)
- C#支持預處理?靠
- #region #endregion
方法和參數
- using System;
- C# 4.0 可選參數(這1般不是C++才有的特性嗎)
- C# 4.0 命名參數(這是1般腳本語言中才有特性?。?/li>
- 異常catch順序:從最具體到最1般?――是不是應當看異常在代碼履行流程中可能出現的前后順序呢???
- int.TryParse(ageText, out ageVar) //見鬼,這不如Ruby靈活
類
- this(=VB里的Me)
- 屬性是CIL中的1種顯式的構造:
- .property instance string Name(){
- .get instance string ClassA::get_Name() //援用實際生成的getter方法
- C# 3.0 對象初始化器
- 集合初始化器:l = new List<Employee> { ... }
- this調用另外一個構造器:恩,有點類似于C++的成員初始化列表,或是Java的構造函數間調用
- C# 3.0 匿名類型:var p = new { Name="ABC", Age=20 };//不要濫用,可能有性能問題?
- 靜態構造器:static ClassName() { ... } //這與Java的static{}相比,語法稍顯累墜了
- C# 3.0 擴大方法:定義1個static方法,摹擬為對應類的成員函數(第1個參數聲明需加上this限定)――這只是1個編譯期特性,st
- const vs. readonly(Java final?)
- C# 2.0 部份類 partial class A { ... } //不允許對編譯好的類進行擴大,用于分解實現代碼到多個文件――看來又是1個編譯期特性,st
- C# 3.0 部份方法:必須返回void?不允許out參數,但可以用ref
- 可在1個partial class里聲明,在對應的另外一個partial class里實現?有點像C/C++了,哈
繼承
- 自定義類型轉換:public static implicit operator OtherType(ThisType obj) { ... }
- sealed class ...
- virtual:C#默許都是非虛方法(fk,這是故意跟Java劃清界限???)(多是.NET CLR為了兼容C++語言作出的設計。。。)
- 子類重寫:override
- new修飾符?
- override sealed //制止進1步的派生實現;
- base:調用基類版本的實現 //C#語言最大的問題是關鍵字是否是太多了???
- abstract
- is //Java instanceof
- as
接口
- interface
- interface A : B //不需要Java里extends與implements的辨別;
值類型(struct)
- Java里沒有辨別,雖然概念上有EJB、DTO、POJO等的區分,因此也能夠說C#對概念的分類更清晰些
- default(int)
- box/unbox
- lock不能用于System.ValueType?
- enum
合式類型
- 在對象的生命周期內,GetHashCode()應當返回相同的值,即便對象的數據產生了改變(。。。?)
- ReferenceEquals?
- 名字空間別名限定符:extern alias CoordPlus;
- csc /R:CoordPlus=cp.dll ... Program.cs
- 終結器:~ClassName() { Close(); ...}
- using(RAAI):必須實現IDisposable?
- C# 4.0 延遲初始化:System.Lazy<T> //有點函數編程的味道~
異常處理
- 無參數的catch{}:有點像C++里的catch(...){}
- throw; 不要 throw new Exception ?(后者會重置異常棧)
- checked/unchecked{}塊
泛型
- Pair<TFirst,TSecond> --> C# 4.0 Tuple 最多可處理7個參數
- 束縛:
- class BinTree<T> where T: System.IComparable<T> { ...
- *協變(upcast,covariance)/逆變
- C# 4.0 使用out類型參數(<out T>)允許協變性
- C# 4.0 使用in類型參數(<in T>)允許逆變性
拜托和Lambda表達式
- C# 3.0 delegate
- C# 2.0+ 匿名方法:delegate( args... ) { ... }
- C# 3.0 Func<T>:in* + out{1}
- C# 3.0 Lambda://實際上是用delegate實現的???
- (int a, int b) => { return a+b; }
- 當1個參數時可以不用()
- Lambda表達式不需要{}
- 注意:Lambda表達式無類型
- 外部變量(數理邏輯里的‘自由變量’?)
- 表達式樹?
事件
- 多播拜托(即delegate類型(=> event handler)的+=語法)
- 調用之前檢查拜托是不是null?且先復制到1個局部變量。。。
- +=:System.Delegate.Combine(?內部實現應當是JavaScript的那種方式:遞歸調用,而不是list遍歷)
- p394 event關鍵字的目的就是提供額外的封裝,避免你不謹慎地取消其他定閱者
- public deletegate void MyEventHandler(object sender, EventArgs a);//聲明拜托類型;
- public event MyEventHandler onMyEventHandler = delegate {};//制止賦值;
支持標準查詢運算符的集合接口(C#
3.0引入的新的Enumerable類擴大)
- p407 匿名類型是C#支持‘投影’操作的關鍵 ...
- IEumerable<T>
- foreach時不要修改集合
- 集合類不支持支持IEnumerator<T>,而是通過GetEnumerator()返回1個IEnumerator<T> (恩?有點像Ruby。。。),這保證了對集合的并發訪問(?)
- Current()/MoveNext()
- 1旦實現GetEnumerator,就能夠得到免費的50多個擴大方法(需要using System.Linq;)
- p419 從技術上說,Where()的結果是1個monad,它封裝了根據1個給定的謂詞對1個給定的序列進行挑選的操作。
- 并行LINQ:fileList.AsParallel().Select( ...
- 1 OrderBy() --> 得到1個IOrderedEnumerable<T> --> * ThenBy()
- *Join
- *GroupBy
- *GroupJoin
- + SelectMany:實現外部連接?
- *IQuerable<T>:使自定義的LINQ Provider成為可能
LINQ(有了LINQ,你不再需要ORM;你也不需要編寫集合處理過濾類的代碼;簡潔優雅地實現數據查詢挑選處理的功能)
- e.g. ... = from word in Keywords where !word.Contains('*') select word; //from在前,類似于XQuery的語法!
- from下的let子句(這可以免重復創建相同的對象。。。)
- from filePath in ... let file = new File(filePath) orderby file.Length, filePath select file;
- from與select返回之間可以插入group操作:
- ... group word by word.Contains('*') into(延續) groups ...
自定義集合
- 在方法public IEnumerator<T> GetEnumerator()的內部屢次yield return???
- 編譯器會生成代碼以保護1個狀態機
- yield break:取消迭代
反射、特性和動態編程
- System.Type
- obj.GetType()
- typeof( obj );
- System.Attribute 特性:(有點像JDK 5里的標注?)
- C# CLR最大的特定是代碼數據都可以加上豐富的語義標記。。。
- dynamic數據類型:可發起動態的成員方法調用(duck typing)
- p532 實現自定義動態對象
多線程
- System.Threading和System.Threading.Tasks
- .NET 4.0:TPL和PLINQ
- Task的(屬性)成員:
- IsCompleted
- Status
- Id
- AsyncState
- Task.CurrentId
- *ContinueWith():任務鏈?
- 調用最后1個Task對象的Wait()啟動全部鏈的履行?
- 取消Task:CancellationToken(實際上就是1個條件信號量?)
- Parallel.ForEach(files, (file)=> {...} );
- ThreadPool.QueueUserWorkItem
同步和其他多線程處理模式(TPL)
- Task.Factory.StartNew
- Monitor
- lock //同Java synchronized?
- 避免lock this,typeof(type),string(intern的問題)
- System.Threading.Interlocked
- 將拜托賦給1個局部變量的做法:對+=自然是沒有問題(假定它是并發修改安全的數據結構),但-=呢?
- System.Threading.Mutex
- APM(異步編程模型):X() --> BeginX / EndX
- 基于事件的異步模式(EAP)
- Background Worker模式
平臺互操作和不安全的代碼
- P/Invoke
- ref
- SafeHandle
- unsafe:調用C++代碼?
- fixed(byte* p = &bytes[0]) { ... }
- stackalloc
附錄:CLI
附錄:下載和安裝(.NET和Mono)
附錄:System.Collections.Concurrent
附錄:C# 2.0 3.0 4.0主題
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
------分隔線----------------------------
------分隔線----------------------------