標籤:靜態 new 瞭解 none where 理念 src copy web
C#3 引入的擴充方法這一個理念.
擴充方法最明顯的特徵是在方法參數中第一個參數有this聲明. 其實C#庫中有很多已經是擴充方法了.比如linq中對序列使用的查詢語句, where, select等都是經過擴充的方法.
由於有很多抽象的方法, 比如stream這種, 在很多繼承類裡面沒有完全的達到使用者的目的, 使用者往往需要自己寫一個工具類, 例如StreamUtil來維護所有的繼承類, 一般這種工具類都是靜態. C#3可以使用擴充方法來改進這一需求的實現.
例如代碼:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.IO; 7 8 namespace DennisDemos.Demos 9 {10 public static class StreamUtil11 {12 const int BufferSize = 8192;13 public static void Copy(Stream input, Stream output)14 {15 byte[] buffer = new byte[BufferSize];16 int read;17 while ((read = input.Read(buffer,0,buffer.Length)) > 0)18 {19 output.Write(buffer, 0, read);20 }21 }22 public static byte[] ReadFully(Stream input)23 {24 using (MemoryStream ms = new MemoryStream())25 {26 Copy(input, ms);27 return ms.ToArray();28 }29 }30 }31 }StreamUtil
1 WebRequest request = WebRequest.Create("http://www.baidu.com");2 using (WebResponse response = request.GetResponse())3 using (Stream responseStream = response.GetResponseStream())4 using (FileStream output = File.Create("response.dat"))5 {6 StreamUtil.Copy(responseStream, output);7 }View Code
瞭解擴充方法的使用時機以及方式
並不是所有方法都可以作為擴充方法使用, 他必須具備以下特徵:
1. 必須在一個非嵌套的, 非泛型的靜態類中(所以必須是一個靜態方法)
2. 至少要有一個參數
3. 第一個參數必須附加this
4. 第一個參數不能有其他任何修飾符, 比如ref
5. 第一個參數的類型不能使指標類型.
這裡第一個參數的類型成為方法的擴充類型.
【C#】C# in deep 擴充方法