青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Javen-Studio 咖啡小屋

http://javenstudio.org - C++ Java 分布式 搜索引擎
Naven's Research Laboratory - Thinking of Life, Imagination of Future

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  24 隨筆 :: 57 文章 :: 170 評論 :: 4 Trackbacks

3.2         擴展方法(Extension Methods

Lambda表達式是查詢體系(query architecture)的一個重要部分,擴展方法(Extension methods)是另一個重要組成部分。擴展方法結合了“duck typing”(一種可替代任何類型的類型)的彈性(flexibility)特點,使得動態語言(dynamic languages,如JavaScript)更加流行(popular),同時又有靜態型語言(statically typed languages,如C++Java)的優秀性能(performance)和編譯時驗證(compile-time validation)的特點。通過擴展方法,第三方(third parties)可以增加使用了新方法的類型(type with new methods)的公共合同(public contract),使得獨立型的開發者(individual type authors)還能提供他們對這些方法的自己專門的實現(specialized implementation)。

 

擴展方法定義在靜態類(static classes)里,就像靜態方法(static methods)一樣,但是它們在CLR元數據(CLR metadata)里卻被標記為[System.Runtime.CompilerServices.Extension]。程序語言都被鼓勵(encourage)為擴展方法提供一種直觀的語法(direct syntax)。在 C# 語言里,擴展方法是由 this 指針(this modifer)標示(indicate)的,它必須應用于(applied to)擴展方法的第一個參數。下面讓我們來看看一段最簡單的查詢操作符(query operator)的定義代碼:

 

namespace System.Query {
  
using System;
  
using System.Collections.Generic;

  
public static class Sequence {
    
public static IEnumerable<T> Where<T>(
             
this IEnumerable<T> source,
                  Func
<T, bool> predicate) {

      
foreach (T item in source)
        
if (predicate(item))
          yield 
return item;
    }

  }

}

 

擴展方法的第一個參數的類型標示(indicate)擴展的內容所應用(the extension applies to)的類型。在上面的例子中,擴展方法 Where 擴展自 IEnumerable<T> 類型。因為 Where 是一個靜態方法(static method),所以我們可以像其他靜態方法一樣直接調用它(invoke it directly):

 

IEnumerable<string> expr = Sequence.Where(names, 
                                          s 
=> s.Length < 6);

 

然而,擴展方法的一個獨特(unique)的特點是我們還可以使用實例的語法(using instance syntax)來調用它:

 

IEnumerable<string> expr = names.Where(s => s.Length < 6);

 

擴展方法是基于擴展方法的活動范圍內(in scope)在編譯時(compile-time)決定的(resolved)。當引入(import)一個命名空間(namespace)時(在 C# 里使用 using 語句,在VB 里使用 Import 語句),所有的擴展方法是由從 namespace 帶入活動范圍(brought into scope)的靜態類(static classes)定義的。

 

標準查詢操作符(standard query operators)在 System.Query.Sequence 類型里定義成擴展方法。當檢查標準查詢操作符時,你將注意到它們中所有的方法根據(in terms of)接口IEnumerable<T> 來定義的(除了 OfType,將在后面介紹它)。這意味著每一個兼容 IEnumerable<T> 接口的信息源(information source)在 C# 語言里通過簡單地添加如下的 using 語句就可以獲取標準查詢操作符:

 

using System.Query; // makes query operators visible

 

用戶如果想用一個指定的類型(specific type)來替換標準查詢操作符,可以在有一致標識(compatible signatures)的指定的類型上定義他們自己的相同名字的方法(same-named methods),另一種方法是通過擴展指定的類型來(extend the specific type)定義相同名字的方法。用戶如果想完全避免(eschew)使用標準查詢操作符,可以簡單地將 System.Query 置于活動范圍之外,并且為 IEnumerable<T> 接口寫出他們自己的擴展方法就可以了。

 

按照分析規則,擴展方法被賦予了最低優先權(lowest priority),它們只是在沒有相適配(suitable)的目標類型(target type)和它們的基類型(base types)時才被使用。這個規則允許用戶自定的類型(user-defined types)提供他們自己的查詢操作符,比標準查詢操作符更優先使用(take precedence over)。例如,考慮用戶自定義 collection 的實現如下:

 

public class MySequence : IEnumerable<int> {
  
public IEnumerator<int> GetEnumerator() {
    
for (int i = 1; i <= 10; i++
      yield 
return i; 
  }


  IEnumerator IEnumerable.GetEnumerator() 
{
    
return GetEnumerator(); 
  }


  
public IEnumerable<int> Where(Func<intbool> filter) {
    
for (int i = 1; i <= 10; i++
      
if (filter(i)) 
        yield 
return i;
  }

}

 

通過給出這個類的定義,下面的程序:

 

MySequence s = new MySequence();
foreach (int item in s.Where(n => n > 3))
    Console.WriteLine(item);

 

將使用 MySequence.Where 的實現,而不是擴展方法,因為類實體方法(instance methods)比擴展方法(extension methods)更優先使用。

 

前面的提及(mentioned earlier)了屬于標準操作符(standard operator)一員但不是擴展自基于IEnumerable<T> 接口(IEnumerable<T>-based)的信息源的 OfType 類型,下面讓我們來看看 OfTyoe 查詢操作符:

 

public static IEnumerable<T> OfType<T>(this IEnumerable source) {
  
foreach (object item in source) 
    
if (item is T) 
      yield 
return (T)item;
}

 

OfType 即接受基于IEnumerable<T> 接口的信息源,也接受那些在 .NET Framework 1.0 中出現的非參數化的 IEnumerable 接口(non-parameterized IEnumerable interface)。OfType 操作符允許用戶在標準的 .NET collections (classic .NET collections)上應用標準查詢操作符,就像下面的程序:

 

// "classic" cannot be used directly with query operators
IEnumerable classic = new OlderCollectionType();

// "modern" can be used directly with query operators
IEnumerable<object> modern = classic.OfType<object>();

 

在這個例子中,變量 modern 產生了與變量 classic 一樣的順序的數據列表(same sequence of values),但是不同的是它的類型兼容最新的 IEnumerable<T> 代碼(modern IEnumerable<T> code),包括標準查詢操作符。

 

OfType 操作符對新的信息源也是有用的,因為它允許從基于類型的信息源(source based on type)中過濾出數據(filtering values from)。當要制作新的順序的時候(producing the new sequence),OfType 簡單的忽略(omits)原有序列的成員(members of the original sequence)就可以了,這是與類型實參(type argument)不相符的。分析下面的程序,目標是將 string 字符串數據從一個有不同種類數據的數組(heterogeneous array)中分解出來:

 

object[] vals = 1"Hello"true"World"9.1 };
IEnumerable
<string> justStrings = vals.OfType<string>();

 

當在 foreach 語句中列舉(enumerate)變量 justStrings 中的數據時,將得到兩個依次為“Hello”和“World”的 string 字符串序列(a sequence of two strings )。

 

待續, 錯誤難免,請批評指正,譯者Naven 2005-10-22

posted on 2005-10-22 22:30 Javen-Studio 閱讀(1355) 評論(3)  編輯 收藏 引用

評論

# re: 擴展方法(Extension Methods) 2008-01-16 17:38 蜜桃
為什么留那么多沒有必要的原文,看的眼花繚亂?
既然是翻譯,除了會引起歧義的,就沒有必要留那么多原文。  回復  更多評論
  

# re: 擴展方法(Extension Methods) 2008-01-16 17:43 Javen-Studio
哦,為了方便對照著看,感覺這樣會看得更仔細些:)  回復  更多評論
  

# re: 擴展方法(Extension Methods) 2008-11-18 01:12 GUYUE
看來 mitao 對自己的英文翻譯很有把握啊...
不過,怎么不看見你也這么認真仔細的翻譯這么好的文章呢??



謝謝分享.萬分感謝。  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国内外成人在线| 99精品黄色片免费大全| 亚洲欧美三级在线| 亚洲女性裸体视频| 亚洲欧美国产三级| 午夜日韩电影| 久久久免费精品视频| 9人人澡人人爽人人精品| 久久夜色精品亚洲噜噜国产mv| 久久久久久一区二区三区| 欧美日韩在线免费| 亚洲欧美激情一区二区| 亚洲图片你懂的| 亚洲欧美日韩一区二区在线| 亚洲欧美一区在线| 久久一日本道色综合久久| 亚洲国产成人av| 亚洲电影免费观看高清完整版在线观看| 亚洲国产欧美久久| 午夜精品成人在线视频| 欧美大片第1页| 国产精品美女999| 好吊成人免视频| 亚洲黄色影片| 亚洲视频在线观看| 99国产精品99久久久久久| 欧美日韩小视频| 国产精品一区二区三区免费观看| 欧美日韩精品免费观看视一区二区| 国产精品进线69影院| 国产一区二区三区四区三区四 | 亚洲欧洲一区二区三区久久| 欧美国内亚洲| 性欧美1819sex性高清| 久久一区欧美| 国产午夜精品一区二区三区欧美| 在线观看欧美一区| 欧美精品 日韩| 一区二区三区产品免费精品久久75 | 另类图片综合电影| 欧美日韩在线高清| 国产一区三区三区| 制服丝袜亚洲播放| 美女久久一区| 欧美一区二区黄| 欧美日韩喷水| 亚洲黄一区二区| 久久综合亚洲社区| 国产精品一区二区欧美| 国产在线高清精品| 亚洲欧美日韩在线一区| 中文国产成人精品久久一| 一区二区三区自拍| 香蕉国产精品偷在线观看不卡| 亚洲第一综合天堂另类专| 午夜精品视频在线| 欧美日韩综合不卡| 日韩视频在线观看国产| 欧美肥婆在线| 久久艳片www.17c.com| 国产日韩欧美精品在线| 性欧美8khd高清极品| 亚洲视频自拍偷拍| 国产精品久久久久av免费| 在线观看91精品国产麻豆| 国内揄拍国内精品久久| 久久精品视频播放| 性高湖久久久久久久久| 国产精品久久久久7777婷婷| 一区二区三区四区在线| 亚洲国产日韩欧美在线99| 久久只有精品| 亚洲福利视频二区| 欧美大片在线看| 欧美激情va永久在线播放| 日韩视频一区二区三区在线播放免费观看| 欧美成人午夜| 欧美日韩国产在线播放网站| 狠狠色综合日日| 韩日欧美一区二区| 久久手机免费观看| 亚洲桃色在线一区| 国产精品视频久久| aa国产精品| 亚洲一区视频在线观看视频| 国产精品一卡二| 久久久久久久精| 牛牛国产精品| 午夜免费久久久久| 久久久青草婷婷精品综合日韩| 亚洲激情电影中文字幕| 日韩午夜精品视频| 国产资源精品在线观看| 亚洲国产精品一区二区www在线| 欧美日韩精品一区二区三区四区| 亚洲女人小视频在线观看| 欧美一区二区三区精品| 亚洲精品少妇30p| 亚洲欧美国产三级| 日韩视频精品| 久久久久久网| 亚洲免费网站| 欧美国产视频一区二区| 先锋影音网一区二区| 欧美sm视频| 欧美主播一区二区三区美女 久久精品人| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲一区二区在线免费观看| 久久久爽爽爽美女图片| 亚洲一二三区在线| 免费成人小视频| 久久久中精品2020中文| 欧美精品在线视频| 久久另类ts人妖一区二区| 欧美三级日韩三级国产三级| 免费av成人在线| 国产精品综合视频| 日韩视频在线一区二区| 国产欧美亚洲日本| 中文网丁香综合网| 一区二区不卡在线视频 午夜欧美不卡'| 亚洲一区中文| 亚洲午夜在线| 欧美区视频在线观看| 亚洲国产精品成人精品| 亚洲第一精品夜夜躁人人爽| 欧美一级久久| 久久久99国产精品免费| 国产精品免费观看在线| 一本在线高清不卡dvd| 亚洲精品免费在线观看| 嫩草成人www欧美| 欧美国产亚洲视频| 亚洲日韩视频| 欧美激情一区二区三区四区| 欧美激情精品久久久六区热门| 在线观看日韩精品| 免费看成人av| 亚洲精品乱码久久久久久蜜桃91| 亚洲欧洲午夜| 欧美激情一区二区三区成人| 亚洲激情网站| 一区二区三区国产在线观看| 欧美另类高清视频在线| 免费久久精品视频| 久久天堂国产精品| 欧美成人激情在线| 亚洲激情视频| 欧美日韩免费高清| 国产精品99久久久久久久女警| 亚洲一区中文字幕在线观看| 国产精品美女久久久久久免费| 亚洲伊人久久综合| 久久精品人人| 亚洲三级影院| 欧美视频一区| 欧美一区二区黄| 亚洲国产精品成人| 亚洲欧美制服另类日韩| 国产一区二区久久| 免费黄网站欧美| 亚洲天堂免费观看| 久久精品国产77777蜜臀| 欧美激情视频一区二区三区免费| 宅男噜噜噜66一区二区| 欧美jizzhd精品欧美巨大免费| 美国成人毛片| 亚洲激情网站| 午夜一区二区三视频在线观看| 国产热re99久久6国产精品| 久久国产乱子精品免费女| 亚洲国产成人tv| 亚洲欧美中文字幕| 精品动漫av| 欧美午夜不卡影院在线观看完整版免费 | 欧美激情aaaa| 亚洲欧美日韩国产综合在线 | 亚洲夜晚福利在线观看| 国内精品久久久久久久影视蜜臀| 亚洲黄页视频免费观看| 亚洲高清久久久| 欧美日韩成人在线观看| 亚洲一本视频| 亚洲国产成人午夜在线一区| 亚洲影视在线播放| 激情懂色av一区av二区av| 欧美日韩中文在线观看| 久久久人成影片一区二区三区观看 | 国产精品免费一区豆花| 免费一级欧美片在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 亚洲国产导航| 久久久97精品| 亚洲午夜黄色| 久久久91精品国产一区二区精品| 亚洲人成啪啪网站| 国产一区二区三区久久悠悠色av | 亚洲综合清纯丝袜自拍| 亚洲国产精品视频一区| 国产欧美一区二区三区沐欲|