C# 中 yield
關鍵字:迭代器與效能最佳化
yield
關鍵字在 C# 中扮演著至關重要的角色,它簡化了枚舉器的實作和迭代器的創建,顯著提升了程式碼的可讀性和效能。讓我們深入了解其功能。
逐步回傳結果 (Yielding Results
)
yield
關鍵字允許方法暫停其執行,並逐步傳回結果。當呼叫函數迭代一個實作了 IEnumerable
介面的物件時,包含 yield
關鍵字的方法會被重複調用,直到返回序列結束。此機制稱為「逐步返回」(yielding)。
例如,考慮以下程式碼片段:
<code class="language-csharp">IEnumerable<object> FilteredList() { foreach (object item in FullList) { if (IsItemInPartialList(item)) yield return item; } }</code>
FilteredList()
方法依條件從 FullList
逐步傳回物件。當呼叫方迭代結果時,該方法會逐一返回每個匹配項。
實作迭代器 (Implementing Iterators
)
yield
關鍵字簡化了自訂迭代器的建立。在 C# 的早期版本中,必須使用 IEnumerator
物件手動實作枚舉器。 yield
提供了一個更簡潔、更聲明式的方法:
<code class="language-csharp">public IEnumerable<int> Integers() { yield return 1; yield return 2; yield return 4; yield return 8; yield return 16; yield return 16777216; }</code>
這段程式碼回傳一個整數序列,無需明確迭代邏輯。
實際應用 (Real-Life Usage
)
在實際應用中,yield
常用於惰性求值場景,例如從資料庫檢索資料。考慮以下範例:
<code class="language-csharp">public IEnumerable<T> Read<T>(string sql, Func<IDataReader, T> make, params object[] parms) { using (var connection = CreateConnection()) { using (var command = CreateCommand(CommandType.Text, sql, connection, parms)) { command.CommandTimeout = dataBaseSettings.ReadCommandTimeout; using (var reader = command.ExecuteReader()) { while (reader.Read()) { yield return make(reader); } } } } }</code>
此方法建構一個枚舉器,從資料庫表中取得記錄,並根據提供的映射函數 make()
建立類型為 T 的物件。透過使用 yield
,該方法避免將整個結果集載入到記憶體中,從而在處理大型資料集時提高效能。
以上是C# 中的「yield」關鍵字如何建立迭代器並提高效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!