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( );
你你还有更灵活的方法来访问多维数组,你可以给定个别的元素索引来访问该元素:
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++的年代那样开销昂贵,但还是很花时间。更重要的是,它会让数据使用陈旧。考虑下面的代码:
- ››根据经纬度坐标取详细地址(包括国,省,市,街道...
- ››根据浏览器和分辨率调用CSS代码
- ››根据批量URL生成有书签的PDF文档的解决方案
- ››根据status信息对MySQL服务器进行优化
- ››Effective C# 原则40:根据需求选择集合
- ››Effective C# 原则41:选择DataSet而不是自定义的...
- ››Effective C# 原则42:使用特性进行简单的反射
- ››Effective C# 原则43:请勿滥用反射
- ››Effective C# 原则44:创建应用程序特定的异常类
- ››Effective C# 第6章:杂项
- ››Effective C# 原则45:选择强异常来保护程序
- ››Effective C# 原则47:选择安全的代码
更多精彩
赞助商链接