WEB开发网
开发学院软件开发C语言 Effective C# 原则40:根据需求选择集合 阅读

Effective C# 原则40:根据需求选择集合

 2009-02-19 08:17:44 来源:WEB开发网   
核心提示: for ( int i = 0; i < _theBoard.GetLength( 0 ); i++ )for( int j = 0; j < _theBoard.GetLength( 1 ); j++ )_theBoard[ i, j ] = new Square( );你你

for ( int i = 0; i < _theBoard.GetLength( 0 ); i++ )
 for( int j = 0; j < _theBoard.GetLength( 1 ); j++ )
  _theBoard[ i, j ] = new Square( );

你你还有更灵活的方法来访问多维数组,你可以给定个别的元素索引来访问该元素:

Square sq = _theBoard[ 4, 4 ];

如果你要迭代整个集合,你还可以使用迭代器:

foreach( Square sq in _theBoard )
 sq.PaintSquare( );

与锯齿数组相比,你可能要这样写:

foreach( Square[] row in _theBoard )
 foreach( Square sq in row )
  sq.PaintSquare( );

锯齿数组里的每一个新的维引用了另一个foreach语句。然而,对于一个多维数组,每一个foreach语句都要产生代码来检测数组每个维上的界线。foreach语句在每个维上生成特殊的代码来迭代数组。foreach循环生成的代码与你这样手写是一样的:

for ( int i = _theBoard.GetLowerBound( 0 );
 i <= _theBoard.GetUpperBound( 0 ); i++ )
 for( int j = _theBoard.GetLowerBound( 1 );
  j <= _theBoard.GetUpperBound( 1 ); j++ )
  _theBoard[ i, j ].PaintSquare( );

考虑在内层循环上所有对GetLowerBound 和GetUpperBound 的调用,这看上去是认低效的,但这确实是很高效的结构。JIT编译器对数组类是很了解的,它们会缓存数组界线,而且可以识别内层的迭代界线从而省略它们(参见原则11)。

数组类的两个主要的不利因素可能会让你考虑使用.Net框架里的其它集合类。第一个影响就是改变数组的大小:数组不能动态的改变大小。如果你须要修改任意数组及任意维数的大小,你必须创建一个新的数组,然后拷贝所有已经存在的元素到新的数组里。改变大小要花时间:因为新的数组要分配,而且所有的元素要拷贝到新的数组里。尽管拷贝和移动在托管堆上并不是像使用C和C++的年代那样开销昂贵,但还是很花时间。更重要的是,它会让数据使用陈旧。考虑下面的代码:

上一页  1 2 3 4 5 6 7 8  下一页

Tags:Effective 原则 根据

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接