如何在方法之间传递数组?

问题描述 投票:3回答:1

我正在跟着一本书,尝试“挑战”。在这里,我遇到了在方法之间正确返回并传递数组的问题。返回数组时出错,尤其是从第二种方法返回数组,然后将其传递给第三种以进行打印。

我从概念上理解堆栈,堆,值和引用,但是显然可以错误。每种方法似乎都可以使用。

using System;

namespace PracticeArray
{
    class Program
    {
        static int[] GenerateNumbers()
        {
            Console.WriteLine("Enter a number to generate array from:");
            string input = Console.ReadLine();
            int inputNumber = Convert.ToInt32(input);

            int[] generatedArray = new int[inputNumber];
            for (int i = 0; i < generatedArray.Length; i++)
            {
                generatedArray[i] = i;
            }

            return generatedArray;
        }

        static int[] Reverse(int[] arrayToReverse)
        {
            int count = arrayToReverse.Length;

            int[] arrayToReturn = new int[count];

            count--;

            for (int i = 0; i < arrayToReturn.Length; i++)
            {
                arrayToReturn[i] = arrayToReverse[count--];

            }

           return arrayToReturn;
        }

        static void PrintNumbers(int[] numbersToPrint)
        {

            foreach (int singleNumber in numbersToPrint)
            {
                Console.Write(singleNumber + ", ");
            }
        }

        static void Main(string[] args)
        {

            int[] numbers = GenerateNumbers();
            Reverse(numbers);
            PrintNumbers(numbers);

        }
    }
}
c# arrays parameter-passing return-value
1个回答
3
投票

问题

您返回的数组是一个新数组:

查看Reverse功能。您创建一个名为arrayToReturn的新数组并返回该数组。您也永远不会修改原始输入数组arrayToReverse

        static int[] Reverse(int[] arrayToReverse) // this input array is never modified
        {
            int count = arrayToReverse.Length;
            // ...
            arrayToReturn = new int[count]; // Here is the new array
            // ...
            return arrayToReturn; // you return the new array
        }

现在查看传递了一些生成数字的Reverse调用位置,但是您忽略了该函数的返回值,因此您永远无法找出新数组是什么。记住,上面我们已经建立了不修改输入数组元素的功能。因此,numbers将保持不变。

        static void Main(string[] args)
        {
            int[] numbers = GenerateNumbers();
            Reverse(numbers); // you ignored the return value of `Reverse`
            PrintNumbers(numbers); // These are the original unreversed numbers
        }

修复

选项1-用于存储结果的新变量

要解决此问题,请将Reverse返回的数组存储在变量中并打印这些数字。

        static void Main(string[] args)
        {
            int[] numbers = GenerateNumbers();
            int[] reversedNumbers = Reverse(numbers);
            PrintNumbers(reversedNumbers);
        }

选项2-重复使用相同的变量来存储结果

在此选项中,您只需丢弃从Reverse返回的新的反向数字数组并将其分配给numbers变量,即可丢弃原始数组。分配之后,numbers将引用从Reverse返回的反向数组。原始数组被孤立并遗忘了-最终收集了垃圾。

        static void Main(string[] args)
        {
            int[] numbers = GenerateNumbers();
            // repurpose the `numbers` variable to store the result.
            numbers = Reverse(numbers);
            PrintNumbers(numbers);
        }

0
投票

数组是引用类型,因此当您将numbers传递给Reverse方法时,将arrayToReturn分配给arrayToReverse就足够了。但是不推荐。

您将数组定义为返回类型并返回实际的反向数组,因此请使用方法返回的数组(如其他答案中所建议)。

© www.soinside.com 2019 - 2024. All rights reserved.