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

时间:2015-11-20 11:59:01

标签: c# arrays ref

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

  

错误1非静态字段需要对象引用,   方法或属性'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;
        }
    }
}

3 个答案:

答案 0 :(得分:10)

简单的改变:

private void swapRotations(int[] intArray);

为:

private static void swapRotations(int[] intArray);

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

另请参阅@ ASh关于如何正确执行swapRotations功能&#34;&#34;的答案。注意我说的正确,因为仍然会抛出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;
}

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

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;
    }