我正在跟着一本书,尝试“挑战”。在这里,我遇到了在方法之间正确返回并传递数组的问题。返回数组时出错,尤其是从第二种方法返回数组,然后将其传递给第三种以进行打印。
我从概念上理解堆栈,堆,值和引用,但是显然可以错误。每种方法似乎都可以使用。
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);
}
}
}
您返回的数组是一个新数组:
查看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
}
要解决此问题,请将Reverse
返回的数组存储在变量中并打印这些数字。
static void Main(string[] args)
{
int[] numbers = GenerateNumbers();
int[] reversedNumbers = Reverse(numbers);
PrintNumbers(reversedNumbers);
}
在此选项中,您只需丢弃从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);
}
数组是引用类型,因此当您将numbers
传递给Reverse
方法时,将arrayToReturn
分配给arrayToReverse
就足够了。但是不推荐。
您将数组定义为返回类型并返回实际的反向数组,因此请使用方法返回的数组(如其他答案中所建议)。