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

Javen-Studio 咖啡小屋

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

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

3.2         擴(kuò)展方法(Extension Methods

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

 

擴(kuò)展方法定義在靜態(tài)類(static classes)里,就像靜態(tài)方法(static methods)一樣,但是它們在CLR元數(shù)據(jù)(CLR metadata)里卻被標(biāo)記為[System.Runtime.CompilerServices.Extension]。程序語言都被鼓勵(lì)(encourage)為擴(kuò)展方法提供一種直觀的語法(direct syntax)。在 C# 語言里,擴(kuò)展方法是由 this 指針(this modifer)標(biāo)示(indicate)的,它必須應(yīng)用于(applied to)擴(kuò)展方法的第一個(gè)參數(shù)。下面讓我們來看看一段最簡單的查詢操作符(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;
    }

  }

}

 

擴(kuò)展方法的第一個(gè)參數(shù)的類型標(biāo)示(indicate)擴(kuò)展的內(nèi)容所應(yīng)用(the extension applies to)的類型。在上面的例子中,擴(kuò)展方法 Where 擴(kuò)展自 IEnumerable<T> 類型。因?yàn)?/SPAN> Where 是一個(gè)靜態(tài)方法(static method),所以我們可以像其他靜態(tài)方法一樣直接調(diào)用它(invoke it directly):

 

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

 

然而,擴(kuò)展方法的一個(gè)獨(dú)特(unique)的特點(diǎn)是我們還可以使用實(shí)例的語法(using instance syntax)來調(diào)用它:

 

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

 

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

 

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

 

using System.Query; // makes query operators visible

 

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

 

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

 

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;
  }

}

 

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

 

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

 

將使用 MySequence.Where 的實(shí)現(xiàn),而不是擴(kuò)展方法,因?yàn)轭悓?shí)體方法(instance methods)比擴(kuò)展方法(extension methods)更優(yōu)先使用。

 

前面的提及(mentioned earlier)了屬于標(biāo)準(zhǔn)操作符(standard operator)一員但不是擴(kuò)展自基于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 中出現(xiàn)的非參數(shù)化的 IEnumerable 接口(non-parameterized IEnumerable interface)。OfType 操作符允許用戶在標(biāo)準(zhǔn)的 .NET collections (classic .NET collections)上應(yīng)用標(biāo)準(zhǔn)查詢操作符,就像下面的程序:

 

// "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>();

 

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

 

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

 

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

 

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

 

待續(xù), 錯(cuò)誤難免,請批評指正,譯者Naven 2005-10-22

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

評論

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

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

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



謝謝分享.萬分感謝。  回復(fù)  更多評論
  


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲嫩草精品久久| 欧美揉bbbbb揉bbbbb| 你懂的视频欧美| 久久精品伊人| 蜜桃av噜噜一区二区三区| 久久亚洲私人国产精品va媚药 | 最新国产精品拍自在线播放| 狠狠狠色丁香婷婷综合久久五月| 一区在线播放| 国产午夜精品在线| 狠狠久久亚洲欧美| 在线日本高清免费不卡| 亚洲精品中文字| 制服丝袜激情欧洲亚洲| 亚洲欧美不卡| 噜噜噜在线观看免费视频日韩| 欧美黄色免费| 亚洲婷婷综合色高清在线| 亚洲欧美日韩电影| 欧美1区免费| 国产精品va| 激情综合中文娱乐网| 日韩天堂在线视频| 久久国产精品久久精品国产| 欧美激情视频一区二区三区免费 | 亚洲日本一区二区| 亚洲综合国产激情另类一区| 久久久久亚洲综合| 日韩视频免费观看高清完整版| 亚洲永久免费观看| 欧美激情视频一区二区三区不卡| 欧美亚洲不卡| 亚洲精品美女在线观看| 久久精品99| 99精品视频一区| 美女网站久久| 国产亚洲高清视频| 一级成人国产| 亚洲高清电影| 一本久久a久久精品亚洲| 久久久99免费视频| 国产伦精品免费视频| 国产亚洲欧洲一区高清在线观看| 亚洲精品国产日韩| 六月婷婷一区| 亚洲欧美一级二级三级| 欧美日韩精品欧美日韩精品 | 久久精品盗摄| 国产精品网站在线播放| 一区二区av| 亚洲三级电影全部在线观看高清| 久久青草福利网站| 狠狠噜噜久久| 久久精品视频在线免费观看| 亚洲色无码播放| 欧美日韩免费在线| 一二三区精品| 一区二区精品国产| 国产精品sss| 亚洲欧美日韩在线播放| 日韩视频永久免费| 国产精品v日韩精品v欧美精品网站| 亚洲人线精品午夜| 亚洲电影在线看| 欧美高清影院| 一区二区三欧美| 99国产精品久久久久久久久久 | 午夜久久久久久| 国产九九视频一区二区三区| 香蕉久久夜色精品国产| 亚洲视频一二区| 国产精品丝袜白浆摸在线| 亚洲男人的天堂在线观看| 亚洲视频电影图片偷拍一区| 国产精品户外野外| 国产精自产拍久久久久久| 亚洲一区二区综合| 亚洲一区二区视频在线| 国产精品自拍小视频| 久久久一本精品99久久精品66| 欧美伊人久久久久久久久影院| 国语自产精品视频在线看抢先版结局| 久久蜜桃精品| 欧美成人精品福利| 亚洲一区二区三区免费观看| 亚洲女优在线| 在线观看视频亚洲| 亚洲精品国产精品乱码不99| 欧美午夜视频在线| 久久全国免费视频| 欧美电影免费观看高清完整版| 亚洲午夜在线观看| 欧美专区福利在线| 一本大道久久精品懂色aⅴ| 亚洲一区二区三区在线播放| 国产一区二区三区久久悠悠色av | 亚洲人成欧美中文字幕| 欧美日一区二区在线观看 | 亚洲影院免费观看| 欧美亚洲日本网站| 亚洲精品一二| 亚洲欧美国产精品va在线观看| 精品成人免费| 99成人在线| 国内自拍视频一区二区三区 | 欧美高清视频| 国产精品v欧美精品v日韩精品| 久久久久国产一区二区| 欧美精品1区2区3区| 久久久噜噜噜久久中文字免| 欧美日韩国产三级| 你懂的国产精品| 国产精品欧美日韩一区| 亚洲福利视频网| 黄页网站一区| 夜夜嗨一区二区| 亚洲三级电影全部在线观看高清| 午夜影院日韩| 亚洲尤物视频网| 欧美激情国产高清| 美女精品网站| 国产一区二区成人| 亚洲一区二区黄色| 亚洲一本视频| 欧美精品一区二区三区四区| 免费黄网站欧美| 狠狠色噜噜狠狠狠狠色吗综合| 中日韩美女免费视频网址在线观看| 亚洲激情成人在线| 久久综合给合| 久久免费国产精品| 国产婷婷精品| 欧美一区二区三区视频免费播放| 亚洲欧美自拍偷拍| 午夜视频一区在线观看| 亚洲一区二区三区四区在线观看 | 欧美一区二区三区久久精品 | 亚洲人成网站在线观看播放| 久久精品亚洲| 老司机一区二区三区| 国产亚洲一区二区三区在线播放| 亚洲欧美国产77777| 久久久99国产精品免费| 精品成人乱色一区二区| 久久久久久色| 久久gogo国模裸体人体| 亚洲神马久久| 国产精品久久999| 亚洲女人天堂av| 久久精品一区二区国产| 国产精品白丝黑袜喷水久久久| 99综合视频| 亚洲女同在线| 国产一区二区三区丝袜| 欧美一区91| 欧美xart系列高清| 亚洲三级色网| 欧美视频一区二区三区四区| 在线视频欧美日韩精品| 欧美中文字幕在线视频| 伊人婷婷久久| 欧美伦理影院| 亚洲一区影院| 免费不卡在线观看av| 日韩视频一区二区在线观看 | 激情综合色综合久久综合| 久久综合九色九九| 99re6热只有精品免费观看 | 亚洲国产精品视频| 亚洲免费影视第一页| 国产在线国偷精品产拍免费yy| 久久嫩草精品久久久久| 亚洲免费观看高清在线观看 | 久久精品欧洲| 亚洲黄色小视频| 国产精品久久毛片a| 久久精品国内一区二区三区| 亚洲精品国产精品久久清纯直播| 午夜精品一区二区在线观看| 在线国产精品播放| 国产精品区一区二区三| 欧美国产精品人人做人人爱| 亚洲欧美乱综合| 欧美大成色www永久网站婷| 亚洲一级在线观看| 在线观看国产精品淫| 国产精品一区免费观看| 欧美成人精品1314www| 久久国产精品免费一区| av不卡在线观看| 欧美高清视频在线播放| 欧美在线观看网站| 一本色道综合亚洲| 亚洲精美视频| 在线不卡中文字幕| 国产美女精品视频| 欧美三级黄美女| 欧美黑人在线观看| 久久人人超碰| 久久av一区二区三区漫画|