C# 如何安全地检查数组边界

C# 如何安全地检查数组边界,c#,arrays,C#,Arrays,我正在制作2D阵列中的生命游戏。我需要确定所有相邻单元格何时为空,所以我只需测试所有单元格。除非正在检查的单元格是边界,否则它工作正常。当然,测试X+1会抛出一个异常,因为索引超出了数组边界。我能以某种方式处理这个问题而不是处理异常吗? 谢谢是的,在访问索引i+1处的元素之前,请检查i+1是否严格低于数组。使用GetLength(0)和GetLength(1)获取数组的宽度和高度 运行时还为自己的边界检查使用了一个简洁的性能技巧:强制转换为unsigned int,将两个检查减少为一个。但由于这

我正在制作2D阵列中的生命游戏。我需要确定所有相邻单元格何时为空,所以我只需测试所有单元格。除非正在检查的单元格是边界,否则它工作正常。当然,测试X+1会抛出一个异常,因为索引超出了数组边界。我能以某种方式处理这个问题而不是处理异常吗?
谢谢

是的,在访问索引
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版本。