C# 值超出数组边界

C# 值超出数组边界,c#,arrays,exception-handling,C#,Arrays,Exception Handling,我通过数组进行迭代,有时我必须检查超出边界的值。当然,它会抛出异常,但我不想在异常发生后完全停止应用程序,只需跳过代码的这个元素 这样的东西是安全的,不会导致内存泄漏吗 try { if (arrayName[i - 1, j].DoSomething()) something++; } catch { // empty for purpose } 更好的做法是使用if语句或类似语句,而不是接受异常 您可以在此处查看有关此主题的进一步讨论: 只需检查索引是否在范围内即

我通过数组进行迭代,有时我必须检查超出边界的值。当然,它会抛出异常,但我不想在异常发生后完全停止应用程序,只需跳过代码的这个元素

这样的东西是安全的,不会导致内存泄漏吗

try
{
    if (arrayName[i - 1, j].DoSomething())
         something++;
}
catch
{ // empty for purpose
}

更好的做法是使用if语句或类似语句,而不是接受异常

您可以在此处查看有关此主题的进一步讨论:
只需检查索引是否在范围内即可
GetLength
返回指定维度的长度:

if (i - 1 < arrayName.GetLength(0) && j < arrayName.GetLength(1))
{
    if (arrayName[i - 1, j].DoSomething())
        something++;
}
if(i-1
只要您在
try
块中分配资源的方式不使异常导致资源不被释放(通常通过
Dispose
方法),它就不会导致内存泄漏。如果是这种情况,请考虑使用块来保证资源被释放。 不太清楚您试图做什么,但似乎您试图使用异常作为一种机制来避免显式检查数组索引是否有效。这(通常)是一件坏事,因为异常应该用于异常情况,如果输入是合理的,并且没有合理的方法来阻止它,那么您不希望发生异常情况。如果您提供更多的上下文,我们可能会建议一种更好的方法

此外,正如Kfugsland所说,您几乎应该始终避免使用空的和非限定的
catch
块,因为这些块将捕获
try
块中发生的任何异常,而不仅仅是您希望抛出的异常。例如,堆栈后面的某个内部方法可能会抛出一个完全无关的异常,该异常与您自己的代码无关,只会被吞没。你一点也不知道,但结果是不可预测的,很可能是不正确的


相反,您应该只尝试对特定的异常类型使用限定的
catch
语句。

我会检查以确保数组中的位置有效

if (arrayName[i - 1, j] != null) 
{
  arrayName[i - 1, j].DoSomething();
}
或者使用try/catch,但是记录它,这样它就不会永远丢失

try
{
    if (arrayName[i - 1, j].DoSomething())
         something++;
}
catch(Exception e)
{ 
    _log.Error(e.Message);
}

无论如何,你所概述的方法,而不是最佳实践,不会导致内存泄漏

至少它不应该像C++一样导致内存泄漏。您最好检查是否可以调用该方法,即空引用检查或其他。和/或根据建议检查阵列边界。