foreach語句是在C#中新引入的,C和C++中沒有這個語句,而Visual Basic的程序員應該對它不會陌生。它表示收集一個集合中的各個元素,並針對各個元素執行內嵌語句。語句的格式為:
foreach(type identifier in expression)embedded-statement
其中類型(type)和標識符(identifier)用來聲明循環變量,表達式(expression)對應集合。每執行一次內嵌語句,循環變量就依次取集合中的一個元素代入其中。在這裡,循環變量是一個只讀型局部變量,如果試圖改變它的值或將它作為一個ref或out類型的參數傳遞,都將引發編譯時的錯誤。
foreach語句中的expresssion必須是集合類型,如果該集合的元素類型與循環變量類型不一致,則必須有一個顯示定義的從集合中的元素類型到循環變量元素類型的顯式轉換。
集合的概念相信大家都不陌生,它表示一組相同或相似的數據項總的描述。那麼在C#中,究竟什麼樣的類型算是集合類型呢?我們從語法上給出集合類型的定義:
●該類型必須支持一個形為Getenumerator()的公有的非靜態方法,該方法的返回類型為結構、類或接口。
●形為GetEumerator()的方法返回的結構、類或接口應當包含一個公有的非靜態的方法MoveNext(),該方法的返回類型為布爾型。
●形為GetEumerator()的方法返回的結構、類或接口應當包含一個公有的非靜態的屬性Current,該屬性可以讀出。
如果一個類型同時滿足以上三個條件,該類型稱為集合類型。Current屬性的類型叫作該集合類型的元素類型。
我們姑且不論集合類型的具體形式,只從foreach語句的使用角度舉一個例子。
假設Prime是一個滿足條件的集合類型,它的元素類型為0到1000以內的質數。MyInt是我們自定義的一個類型,其范圍為200到300之間的整數。下面這段程序用於在屏幕上打印出從200到300以內的所有質數。
程序清單8-5:
using System; using System.Collections; class Test { public static void Main() { Console.WriteLine("See the prime number:"); foreach(MyInt x in Prime) Console.WriteLine("{0}",x); } }
順便說一句,數組類型是支持foreach語句的,對於一維數組,執行順序是從下標為0的元素開始,一直到數組的最後一個元素;對於多維數組,元素下標的遞增是從最右邊那一維開始的,依次類推。
同樣,break和continue可以出現在foreach語句中,功能不變。