在数组上使用 'ref' 关键字

Using the 'ref' keyword on an array

我理解为什么在编写交换两个值的函数时应该使用 ref,但我不知道如何在整个数组上使用该关键字。这听起来很愚蠢,但我已经尝试在我可能想到的任何地方粘贴关键字(例如,在参数之前,在变量之前,等等......)但我仍然收到以下错误:

Error 1 An object reference is required for the non-static field, method, or property 'Swap.Program.swapRotations(int[])'

这是我到目前为止所做的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Swap
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] A = {0, 1, 2, 3, 4, 5, 6, 7};

            swapRotations(A);

            for (int i = 0; i < A.Length; i++)
                Console.WriteLine(A[i]);

            Console.WriteLine("\nPress any key ...");
            Console.ReadKey();
        }

        private void swapRotations(int[] intArray)
        {
            int bone1Rot = intArray[3];
            int bone2Rot = intArray[5];

            // Make the swap.
            int temp = bone1Rot;
            bone1Rot = bone2Rot;
            bone2Rot = temp;
        }
    }
}

简单的只是改变:

private void swapRotations(int[] intArray);

至:

private static void swapRotations(int[] intArray);

问题是因为调用方法是 static 所以它使用的任何方法要么需要有一个引用它们的对象,要么本身是静态的。

另请参阅@ASh 关于如何执行 swapRotations 函数 "properly" 的回答。请注意,我说得对,因为仍然可能抛出 IndexOutOfRange 异常。为了正确和通用地做到这一点,我会按照以下方式做一些事情:

private static void SwapIndexes(int[] array, int index1, int index2)
{
    if (index1 >= array.Length || index2 >= array.Length)
        throw new Exception("At least one of the indexes is out of range of the array");

    int nTemp = array[index1];
    array[index1] = array[index2];
    array[index2] = nTemp;
}

ArraysReference 类型。所以不需要使用 ref 关键字来传递数组。而且您的问题不在 ref 关键字中,但您 必须 仅从静态方法 调用 静态方法。 例如:

    static void Main(string[] args)
    {
        int[] A = {0, 1, 2, 3, 4, 5, 6, 7};

        swapRotations(A);

        for (int i = 0; i < A.Length; i++)
            Console.WriteLine(A[i]);

        Console.WriteLine("\nPress any key ...");
        Console.ReadKey();
    }

    private static void swapRotations(int[] intArray)
    {           
        // Make the swap.
        int temp = intArray[3];  
        intArray[3] = intArray[5];
        intArray[5] = temp;
    }

swap 方法不起作用,因为你根本不改变数组

ref中不需要,只需设置数组元素

private void swapRotations(int[] intArray)
{
    int temp = intArray[3];
    intArray[3] = intArray[5];
    intArray[5] = temp;
}