程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 通過索引器簡化C#類型信息訪問

通過索引器簡化C#類型信息訪問

編輯:關於C#

前言

作為一個有別於Java、Ruby等語言的一個特性,C#可以用索引器(Indexer)將類型本身以對象數組的形式供外部使用。下面是一個對比:(為了簡化,略去了邊界檢查)

相關廠商內容

QClub:當SOA遭遇現實(7.26 杭州)

不難看出通過引入索引器,我們的目標類型DataAccess在涉及到根據編號檢索的時候看上去更接近一個數組的樣子,客戶程序的開發人員不用關心具體的方法名稱是GetData/GetInternalData或者是SetData/ UpdateData,僅僅把它當成一個數組就可以了,編碼上也更加簡潔、直觀。

但索引器提供的檢索能力不僅單純面向一個一維數組,我們可以用它檢索多維數組、內存空間數據(Space Data, 2D或3D,如果您的應用是面向時空穿梭的話,完全可以擴展至4D)、復雜的數據結構(樹、圖、語義網絡)、多因素的計算結果… … 只要類型的封裝人員和使用人員就每個索引項的含義達成一致即可。例如:下面是對法定公歷節日信息訪問的類型:

是不是感覺上訪問GregorianCalendarFixture的時候就像我們面對著一個DataTimePicker控件一樣?

實現多途徑的數據項檢索

上面都是單個途徑看目標類型的數據組織,但就像我們看待一個人一樣,評價它往往會通過不同途徑,同時每個途徑可能也是一組對象或一個復雜的數據結構系統,而且每個檢索的指標是不同的數據類型。同樣出於封裝和簡化客戶程序使用的考慮,我們可以繼續用索引器完成。

比如:我們希望提供按照城市ID、中文拼音縮寫、城市名稱枚舉3種方式獲得其氣溫情況,為了便於客戶程序使用,我們重載出了一系列索引器,這樣一方面客戶程序可以根據上下文用不同類型的鍵值訪問,也省去了解具體應該使用哪個函數的繁瑣。

實現類似RDBMS中聯合主鍵或唯一性索引的訪問

通過“索引器”這個名稱我們會很自然的聯系到RDBMS(關系數據庫)中的索引,就如我們在設計數據庫邏輯結構的過程一樣,往往為了唯一標注每條記錄,常常會用到主鍵或唯一性索引,而構成他們的屬性(列)可能是1項也可能是幾項的聯合。.NET平台為了跨層調用的方便,從一開始就支持離線的DataSet和基於DOM的XML解析數據,隨著.NET平台升級到2.0,對象化的配置類型也可以提供基於內存緩沖信息的訪問。應用可能要求包裝類型提供基於聯合索引的查詢(尤其對於屬性較多、關系復雜的實體),而索引器又成了一個非常優雅的封裝方式。

比如:一個員工實體包括“FirstName”、“FamilyName”、“Title”三個屬性,我們需要包裝一個Staff類型管理全部的員工信息。

同時根據UI綁定或其他功能檢索的需要,我們會根據他的聯合主鍵(FirstName + FamilyName)提供一個索引器,用它訪問具體的員工記錄。示例如下:

通過委托傳遞索引規則

如上文,對於檢索規則固定的情況而言,我們可以通過在索引器內部硬編碼完成,但如果要完成一些更為公共的類庫,我們往往還需要“授之以漁”,即除了告訴他“要檢索”這個任務之外,還要把檢索策略和規則告訴它。這方面C#是非常有優勢的,因為它有對象化的托管委托類型(delegate),而且.NET Framework FCL部分也提供了很多現成的委托,所以我們不妨善加利用。

這時候,我們會發現索引器的功能更加強大,我們就像在使用SQL語句的WHERE 子句一樣,以靈活的方式對目標數據根據需要篩選。

不過,我們在實際使用中WHERE子句可能還會包括不只一條的限制條件,索引器一樣可以完成。例如,定義為下列形式:

LINQ時代的索引器

乍一看,索引器似乎已經越來越接近於LINQ通過Lamada表達式完成的功能,不過有些區別:

定位上索引器一般面向單條檢索結果,而不是批量結果(盡管我們可以讓索引器返回一個IEnumerable)

從封裝和客戶程序使用的角度看,LINQ有各種內置並被優化的LINQ to系列,而索引器給客戶程序是一種更為貼近業務語義、更加直觀的形式,因為客戶程序無需寫LINQ查詢,只是按照鍵值檢索即可

不過,把兩者結合使用倒是一個非常不錯的組合,索引器做接口、LINQ完成內部檢索邏輯,客戶程序在無需記住具體方法名稱的前提下,按照鍵值檢索即可,索引器內部則依托LINQ to系列的基礎,提供對各種異構數據源的訪問。

小結

就像我們設計接口時會根據業務領域,把類型的職能分解一樣,操作類型的時候同樣,一樣可以根據訪問內容不同,選擇使用不同的訪問方法,比如:

索引器:承擔各種檢索和查找的工作

屬性(Property):承擔“它的…特性是…”或“它們的…特質是…”的工作,用來標注某個實例特性(成員屬性)或靜態特性(靜態屬性)

普通的方法:承擔“讓它處理……”的職能

而事件定位於“當……發生的時候,需要作些……”

受到慣性影響,我們常常把索引器作為一個僅僅按照編號反饋結果的入口,但就如SQL 中的WHERE子句, 我們其實可以做很多。善用之,它會令我們的程序更加親切、更加清晰。

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