Posted on 2013年04月17日 by U3d / Unity3D 基礎教程 /被圍觀 425 次html
* 版權聲明:轉載時請以超連接形式標明文章原始出處和做者信息express
* 本文來自:Unity3D 教程手冊數組
* 本文連接: http://www.manew.com/4143.htmlide
爲何要儘可能避免使用foreach。GC Alloc是形成Unity遊戲偶爾卡幀的罪魁禍首。第一個循環大概會形成2.3K的GC Alloc。第二個循環則沒有任何GC Alloc。因此,不要途方便,處處哪都用foreach循環。this
foreach 語句爲數組或對象集合中的每一個元素重複一個嵌入語句組。foreach 語句用於循環訪問集合以獲取所需信息,但不該用於更改集合內容以免產生不可預知的反作用。此語句的形式以下:3d
foreach (type identifier in expression) statementcode
其中:htm
type對象
identifier 的類型。教程
identifier
表示集合元素的迭代變量。若是迭代變量爲值類型,則沒法修改的只讀變量也是有效的。
expression
對象集合或數組表達式。集合元素的類型必須能夠轉換爲 identifier 類型。請不要使用計算爲 null 的表達式。
而應計算爲實現 IEnumerable 的類型或聲明 GetEnumerator 方法的類型。在後一種狀況中,GetEnumerator 應該要麼返回實現 IEnumerator 的類型,要麼聲明 IEnumerator 中定義的全部方法。
statement
要執行的嵌入語句。
舉一個代碼列子:
01 | using UnityEngine; |
02 | using System.Collections; |
03 | |
04 | public class ForeachTest : MonoBehaviour { |
05 | |
06 | protected ArrayList m_array; |
07 | |
08 | void Start () |
09 | { |
10 | m_array = new ArrayList(); |
11 | for (int i = 0; i < 2; i++) |
12 | m_array.Add(i); |
13 | } |
14 | |
15 | void Update () |
16 | { |
17 | for (int i = 0; i < 1000; i++) |
18 | { |
19 | foreach (int e in m_array) |
20 | { |
21 | //big gc alloc!!! do not use this code! |
22 | } |
23 | } |
24 | |
25 | for (int i = 0; i < 1000; i++) |
26 | { |
27 | for (int k = 0; k < m_array.Count; k++) |
28 | { |
29 | //no gc alloc!! |
30 | } |
31 | } |
32 | } |
33 | } |