将具有原始名称的主要方法数组传递给另一个方法

Passing main methods arrays with their original names to another method

所以我做了一个简单的代码,它将两个不同的数组传递给一个方法,以检查异常。但是有一个问题——当我传递数组时,如果缓存了一个异常,在我的 Exceptions "nameof" 部分,它没有说明是哪个数组,是什么导致了异常。我需要纠正这一点。 那么你有什么想法,我如何在我的代码中做到这一点?

public class CommonEnd
{
    public bool IsCommonEnd(int[] a, int[] b)
    {
        ValidateArray(a);
        ValidateArray(b);
        return a.First() == b.First() || a.Last() == b.Last();
    }

    private void ValidateArray(int[] array)
    {
        if (array == null)
        {
            throw new ArgumentNullException(nameof(array), "Array is NULL.");
        }

        if (array.Length == 0)
        {
            throw new ArgumentOutOfRangeException(nameof(array), "Array length can't be smaller that 1");
        }
    }
}

您的 ValidateArray 方法接收到一些数据。为方便起见,它将该部分命名为 "array"。其他方法可能引用相同的数据,并且它们可能有自己的名称。例如,调用 IsCommonEnd 的方法曾经将该数组命名为 "myPreciousArray",IsCommonEnd 将其命名为 "b",而 ValidateArray 将其命名为 "array"。即使 ValidateArray 有办法访问数组的所有其他名称,您应该选择哪一个?

如果需要区分实例,为什么不在实例明显可识别的地方处理呢?就像在您的 IsCommonEnd 方法中一样?像这样:

public bool IsCommonEnd(int[] a, int[] b)
{
    try
    {
    ValidateArray(a);
    }
    catch(ArgumentNullException ex)
    {
        // you know your 'a' array is null, do whatever you want to do about that
        throw; // if you need this exception to propagate, of course

    }
    catch(ArgumentOutOfRangeException ex)
    {
        // you know your 'a' array is too small, do whatever you want to do about that
        throw; // if you need this exception to propagate, of course

    }
    // the same about 'b'
    try
    {
    ValidateArray(b);
    }
    catch(ArgumentNullException ex)
    {
        // you know your 'b' array is null, do whatever you want to do about that
        throw; // if you need this exception to propagate, of course

    }
    catch(ArgumentOutOfRangeException ex)
    {
        // you know your 'b' array is too small, do whatever you want to do about that
        throw; // if you need this exception to propagate, of course

    }
    return a.First() == b.First() || a.Last() == b.Last();
}

nameof(array) 将始终只是 return 字符串 array。为了知道是a还是b出错了,可以再传一个参数,用nameof高一级

private void ValidateArray(string which, int[] array)
{
    if (array == null)
    {
        throw new ArgumentNullException(nameof(array), $"Array {which} is NULL.");
    }

    if (array.Length == 0)
    {
        throw new ArgumentOutOfRangeException(nameof(array), $"Array {which} length can't be smaller that 1");
    }
}

并在调用方法中:

public bool IsCommonEnd(int[] a, int[] b)
{
    ValidateArray(nameof(a), a);
    ValidateArray(nameof(b), b);
    return a.First() == b.First() || a.Last() == b.Last();
}