当前位置:IT168首页 > 技术开发 > 概述
[收藏此页] [打印] [推荐] [评论]

如何使function傳回多值

责任编辑:nancy作者:ITPUB论坛   2008-05-20   
文本Tag: 微软 sql

【IT168技术文档】

  Abstract
  傳統C/C++若要function傳回多值,會傳回array,C# 1.0會傳回array或ArrayList,C# 2.0呢?直覺學會想到List<T>,但其實使用Iterator更簡潔!!

  Motivation
  C# 2.0有四大新功能,泛型,Iterator,Anonymous Method和Partial Class。iterator可能是其中最怪異的新功能,除了苦思iterator的原理外,更是苦思如何應用在現實的代碼中。

  Introduction
  若要讓function傳回多值,C# 2.0很容易讓人想到使用List<T>,如square() function,無論傳入幾個值,就會傳出該值的平方,如square(1, 2, 3, 4)就會傳回1, 4, 9, 16,若用List<T>
using System; 10using System.Collections.Generic; 11 12class main { 13 public static void Main() { 14 foreach(int n in square(1,2,3,4)) 15 Console.WriteLine(n); 16 } 17 18 static List<int> square(params int[] parms) { 19 List<int> list = new List<int>(); 20 foreach(int i in parms) 21 list.Add(i*i); 22 23 return list; 24 } 25}
  執行結果
1 4 9 16
  以上代碼沒啥大問題,缺點在於List<T>大了點,較占內存,若只需簡單的傳回多個值,使用Iterator更加精簡有效率。
9using System; 10using System.Collections; 11 12class main { 13 public static void Main() { 14 foreach(int s in square(1,2,3,4)) 15 Console.WriteLine(s); 16 } 17 18 static IEnumerable square(params int[] parms){ 19 foreach(int n in parms) 20 yield return n*n; 21 } 22}
  執行結果
1 4 9 16
  squre傳回IEnumerable,這就是一個iterator。yield的執行順序頗怪異,當foreach()第一次執行時,遇到yield return即傳回值,foreach()第二次執行時,則執行上次yield return的下一行,如此依序傳回多值。代碼內沒用到List<T>,當然也不需傳回List<T>,代碼行數和執行效率都遠勝於使用List<T>。

  Conclusion
  Iterator的應用當然不止於此,既然C#會讓yield單獨成為keyword,一定有其重要性,這個應用是我小小的心得,藉此拋磚引玉,希望能激發出Iterator更多的應用。
上一页
1
下一页
收藏到: 添加到“百度搜藏”添加到“QQ书签”添加到“Google书签”添加到“Yahoo收藏”添加到“和讯网摘”
【内容导航】
本文欢迎转载,转载请注明:转载自IT168 [ http://www.it168.com/ ]
本文链接:http://tech.it168.com/d/2008-05-20/200805200818943.shtml
技术开发相关文章   .net server SQL 微软
  • 暂无
友情推介