1. 程式人生 > >【C#】C# in deep 擴展方法

【C#】C# in deep 擴展方法

.text void 靜態方法 com play ext ebr rsize ref

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 StreamUtil 11 { 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 擴展方法