Artech

Develop every application as an art using the most suitable technologies!

常用链接

统计

积分与排名

CnBlogs

专家的Blog|主页

最新评论

[原创]如何改善Managed Code的Performance和Scalability系列之一:由for V.S. for each想到的

一直想写一系列如何提高Performance和Scalability的文章,把我的相关经验和所知道的相关的技巧同大家分享。前一阵在园子里有一篇讨论for each 和 for两种循环那个具有更好的performance的blog,议论得沸沸扬扬。我觉得这是一个很好的切入点,我就已此作为引子,开始我的这个系列的文章。这篇文章的重点不是在于比较这两种循环孰优孰劣,我将讨论的重点是如何更好地定义Collection,如何在判断在什么时候该用Array,什么时候用Collection。  

一、for each的本质

我们知道,所有实现了System.Collections. IEnumerable接口的类,我们都可以对它运用for each loop。为了弄清楚它的执行过程,我先给出一个Sample:

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace Artech.CustomCollection
{
    
struct Employee
    
{
        
Private Fields

        
Constructor

        
Public Properties

        
Tostring
    }


    
class EmployeeList : IEnumerable
    
{
        
private Employee[] _employees;

        
public Employee[] Employees
        
{
            
get return _employees; }
            
set { _employees = value; }
        }


        
IEnumerable Members
    }


    
class EmployeeEnumerator : IEnumerator
    
{
        
private Employee[] _employees;
        
private int _index = -1;

        
public EmployeeEnumerator(Employee[] employees)
        
{
            
this._employees = employees;
        }


        
IEnumerator Members
    }

    
class Program
    
{
        
static void Main(string[] args)
        
{
            Employee[] employees 
= new Employee[] new Employee("0001""Zhang San"21), new Employee("0002""Li Si"30) };
            EmployeeList empoyeeList 
= new EmployeeList();
            empoyeeList.Employees 
= employees;

            Console.WriteLine(
"Begin foreach loop ");
            
foreach (Employee employee in empoyeeList)
            
{
                Console.WriteLine(employee.ToString());
            }

            Console.WriteLine(
"\n\nBegin while loop ");
            IEnumerator enumerator 
= empoyeeList.GetEnumerator();
            
while (enumerator.MoveNext())
            
{