C# 如何安全地检查数组边界
我正在制作2D阵列中的生命游戏。我需要确定所有相邻单元格何时为空,所以我只需测试所有单元格。除非正在检查的单元格是边界,否则它工作正常。当然,测试X+1会抛出一个异常,因为索引超出了数组边界。我能以某种方式处理这个问题而不是处理异常吗?C# 如何安全地检查数组边界,c#,arrays,C#,Arrays,我正在制作2D阵列中的生命游戏。我需要确定所有相邻单元格何时为空,所以我只需测试所有单元格。除非正在检查的单元格是边界,否则它工作正常。当然,测试X+1会抛出一个异常,因为索引超出了数组边界。我能以某种方式处理这个问题而不是处理异常吗? 谢谢是的,在访问索引i+1处的元素之前,请检查i+1是否严格低于数组。使用GetLength(0)和GetLength(1)获取数组的宽度和高度 运行时还为自己的边界检查使用了一个简洁的性能技巧:强制转换为unsigned int,将两个检查减少为一个。但由于这
谢谢是的,在访问索引
i+1
处的元素之前,请检查i+1
是否严格低于数组。使用GetLength(0)
和GetLength(1)
获取数组的宽度和高度
运行时还为自己的边界检查使用了一个简洁的性能技巧:强制转换为unsigned int,将两个检查减少为一个。但由于这会降低可读性,因此如果检查确实对性能至关重要,您可以使用它
(i >= 0) && (i < length)
(i>=0)和&(i
变成
(uint)i < length
(uint)i
如果您想要提高速度,您必须以不同的方式处理边缘单元,并使用
for(int x = 1; x < Size-1; x++) // these all have x-1 and x+1 neighbours
for(int x=1;x
我为2D数组创建了一个扩展方法,以检查是否在边界内:
public static class ExtensionMethods
{
public static bool In2DArrayBounds(this object[,] array, int x, int y)
{
if (x < array.GetLowerBound(0) ||
x > array.GetUpperBound(0) ||
y < array.GetLowerBound(1) ||
y > array.GetUpperBound(1)) return false;
return true;
}
}
公共静态类扩展方法
{
DarrayBounds中的公共静态布尔(此对象[,]数组,int x,int y)
{
if(xarray.GetUpperBound(0)||
yarray.GetUpperBound(1))返回false;
返回true;
}
}
但这需要很多条件,对吗?y小于数组,y大于数组,x小于数组,x大于数组这比捕捉异常要好得多,因为异常是针对异常情况的。一个简单的声明可以很好地澄清这个问题。非常简洁,我们刚刚使用了UINT版本。