程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#本質論(第3版)筆記

C#本質論(第3版)筆記

編輯:C#入門知識

C#本質論(第3版)筆記


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.0int[,] 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 可選參數(這一般不是C++才有的特性嗎)C# 4.0 命名參數(這是一般腳本語言中才有特性!)異常catch順序:從最具體到最一般?——是否應該看異常在代碼執行流程中可能出現的先後順序呢???int.TryParse(ageText, out ageVar) //見鬼,這不如Ruby靈活

    this(=VB裡的Me)屬性是CIL中的一種顯式的構造: .property instance string Name(){ .get instance string ClassA::get_Name() //引用實際生成的getter方法 C# 3.0 對象初始化器 集合初始化器:l = new List { ... } this調用另一個構造器:恩,有點類似於C++的成員初始化列表,或者是Java的構造函數間調用C# 3.0 匿名類型:var p = new { Name="ABC", Age=20 };//不要濫用,可能有性能問題?靜態構造器:static ClassName() { ... } //這與Java的static{}相比,語法稍顯累贅了C# 3.0 擴展方法:定義一個static方法,模擬為對應類的成員函數(第1個參數聲明需加上this限定)——這只是一個編譯期特性,stconst vs. readonly(Java final?)C# 2.0 部分類 partial class A { ... } //不允許對編譯好的類進行擴展,用於分解實現代碼到多個文件——看來又是一個編譯期特性,stC# 3.0 部分方法:必須返回void?不允許out參數,但可以用ref 可在一個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 //禁止進一步的派生實現;base:調用基類版本的實現 //C#語言最大的問題是關鍵字是不是太多了??? abstractis //Java instanceofas

    接口

    interfaceinterface A : B //不需要Java裡extends與implements的區分;

    值類型(struct)

    Java裡沒有區分,雖然概念上有EJB、DTO、POJO等的區別,因此也可以說C#對概念的分類更清晰些default(int)box/unboxlock不能用於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 //有點函數編程的味道~

    異常處理

    無參數的catch{}:有點像C++裡的catch(...){}throw; 不要 throw new Exception ?(後者會重置異常棧)checked/unchecked{}塊

    泛型

    Pair --> C# 4.0 Tuple 最多可處理7個參數約束: class BinTree where T: System.IComparable { ... *協變(upcast,covariance)/逆變 C# 4.0 使用out類型參數()允許協變性C# 4.0 使用in類型參數()允許逆變性

    委托和Lambda表達式

    C# 3.0 delegate C# 2.0+ 匿名方法:delegate( args... ) { ... } C# 3.0 Func:in* + out{1}C# 3.0 Lambda://實際上是用delegate實現的??? (int a, int b) => { return a+b; }當1個參數時可以不用()Lambda表達式不需要{} 注意:Lambda表達式無類型 外部變量(數理邏輯裡的‘自由變量’?)表達式樹?

    事件

    多播委托(即delegate類型(=> event handler)的+=語法) 調用之前檢查委托是否null?且先復制到一個局部變量。。。 +=: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 foreach時不要修改集合集合類不支持支持IEnumerator,而是通過GetEnumerator()返回一個IEnumerator (恩?有點像Ruby。。。),這保證了對集合的並發訪問(?) Current()/MoveNext() 一旦實現GetEnumerator,就可以得到免費的50多個擴展方法(需要using System.Linq;) p419 從技術上說,Where()的結果是一個monad,它封裝了根據一個給定的謂詞對一個給定的序列進行篩選的操作。並行LINQ:fileList.AsParallel().Select( ...1 OrderBy() --> 得到一個IOrderedEnumerable --> * ThenBy()*Join*GroupBy*GroupJoin + SelectMany:實現外部連接? *IQuerable:使自定義的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 GetEnumerator()的內部多次yield return??? 編譯器會生成代碼以維護一個狀態機 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和PLINQTask的(屬性)成員: IsCompletedStatusIdAsyncStateTask.CurrentId *ContinueWith():任務鏈? 調用最後一個Task對象的Wait()啟動整個鏈的執行? 取消Task:CancellationToken(實際上就是一個條件信號量?)Parallel.ForEach(files, (file)=> {...} );ThreadPool.QueueUserWorkItem

    同步和其他多線程處理模式(TPL)

    Task.Factory.StartNewMonitorlock //同Java synchronized? 避免lock this,typeof(type),string(intern的問題) System.Threading.Interlocked將委托賦給一個局部變量的做法:對於+=自然是沒有問題(假設它是並發修改安全的數據結構),但-=呢?System.Threading.MutexAPM(異步編程模型):X() --> BeginX / EndX基於事件的異步模式(EAP)Background Worker模式

    平台互操作和不安全的代碼

    P/InvokerefSafeHandleunsafe:調用C++代碼? fixed(byte* p = &bytes[0]) { ... }stackalloc

    附錄:CLI

    附錄:下載和安裝(.NET和Mono)

    附錄:System.Collections.Concurrent

    附錄:C# 2.0 3.0 4.0主題

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved