使用';ref';关键字

本文关键字:关键字 ref 使用 | 更新日期: 2023-09-27 18:23:47

我理解为什么在编写交换两个值的函数时应该使用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;
        }
    }
}

使用';ref';关键字

简单的更改:

private void swapRotations(int[] intArray);

至:

private static void swapRotations(int[] intArray);

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

还可以看看@ASh关于如何"正确"执行swapRotations功能的回答。注意,我说得很恰当,因为仍然可能引发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;
}

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

ref中无需,只需设置阵列元素

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

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