IFormatProvider介面的理解和使用?

Tags: 時候, 網站, 介面,

IFormatProvider介面是c#中的一個負責做格式化操作的介面,不僅僅在網站製作中很有用處,更重要的是,有的時候會在滲透測試過程中遇到這個東西。深入理解IFormatProvider及其使用方法對某些網站的滲透測試工作很有幫助。

工具/原料

微軟官方參考文件MSDN

程式碼編輯器

方法/步驟

首先,IFormatProvider是一個“介面”。關於介面的特性(“抽象”性、不能寫具體的可執行程式碼,只規定名稱和引數、具體實現由繼承的類負責……),網上有一個精闢的例子{引自【1】},筆者貼在下面了。

介面不提供方法的具體視線,方法的具體實現是寫在繼承介面的函式中的。不過,只要我們知道某個類是繼承了某個介面,那麼我們就可以確定這個類滿足某種(由介面規定的)“約定”——比如說存在某種方法。

總體說來,這句話總結得很精闢:

“介面本質上是類與類之間的一種約定”。

IFormatProvider介面的理解和使用

下面的這個例子{(1)至(2)}{引自【1】}指出:如果不使用介面,在clsProject類使用不同Programmer類的同名函式的時候要反覆過載。

(1)對於Programer類來說,同樣都是每個類裡要實現一個“WriteCode()”函式,只是如果用介面的話介面相當於強制規定類中必須有一個“WriteCode()”函式

IFormatProvider介面的理解和使用

(2)對於Project類來說,則完全不同了!使用了介面以後,就可以直接把介面(IProgrammer)的物件作為引數傳給WriteProgram函式,再也不用過載那麼多次了!同樣,在main()函式中只要知道了某個類有IProgrammer介面,建立一個介面,然後“介面=new 類名”,這個介面直接作為引數傳輸。

頓時感覺C++裡的過載弱爆了有木有!

IFormatProvider介面的理解和使用

IFormatProvider也是c#的一個介面。首先來看官方提供的IFormatProvider的文件{引自【2】},官方對IFormatProvider的解釋是“Provides a mechanism for retrieving(vt.取回; 恢復; [計] 檢索; 重新得到) an object to control formatting.”

粗略地理解,ICustomFormatter相當於“我這個類只能提供型別為ICustomFormatter的物件"”;而IFormatProvider負責提供型別為ICustomFormatter的具體的格式資訊。

IFormatProvider介面的理解和使用

IFormatProvider作為一個介面,只有一個GetFormat函式。那麼,這個函式是幹什麼用的呢?

這個函式規定了繼承這個介面的類裡的GetFormat函式的輸入和輸出——輸入一個Type,輸出是一個物件object。

IFormatProvider介面的理解和使用

函式的輸出object是一個物件,函式的輸入“Type”是這個物件的型別。

綜上所述,可以知道:

對於類來說,繼承了IFormatProvider介面相當於規定類中要有一個GetFormat()函式,同時規定了這個函式接受一個Type物件,返回一個(Type型別的)物件。

IFormatProvider介面的理解和使用

對於函式來說,如果輸入的引數有IFormatProvider介面,則這個位置可以輸入任何繼承了IFormatProvider介面的類的物件。

以StringBuilder.AppendFormat(IFormatProvider, String, Object)方法為例,可以看到這個函式的第一個引數是IFormatProvider,下面看一下函式實際使用的例項,其中enGB是英語 Great Britain的格式設定約定。

IFormatProvider介面的理解和使用

筆者找到了一個對IFormatProvider繼承之後具體實現的例子{引自【3】},貼在下面,也讓大家看看IFormatProvider到底是什麼樣子的。

在這個例子中,因為MyFormater類繼承了ICustomFormatter介面和IFormatProvider介面,所以要寫一個GetFormat函式。ICustomFormatter限制了這個類提供物件的型別;而GetFormat的意思就是——(對於一個物件來說)如果輸入的型別是我的型別(ICustomFormatter),那就把我給你。

IFormatProvider介面的理解和使用

相關問題答案