我是C#的新手,我无法理解为什么这段代码不起作用。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
char[] sw = "ab".ToCharArray();
swap(sw[0], sw[1]);
string end = new string(sw);
Console.Write(end);
}
static void swap(char a, char b)
{
char temp = a;
a = b;
b = temp;
}
}
}
我在控制台上的期望是“ba”,但我得到“ab”。我能够找到解决这个问题的不同方法,但我想知道的是这段代码中的错误是什么。 谢谢你的帮助!
答案 0 :(得分:11)
问题是swap
方法实际上只是操纵a
和b
的本地副本。您需要通过引用传递参数。因此,您可以像这样定义swap
方法:
static void swap(ref char a, ref char b)
{
char temp = a;
a = b;
b = temp;
}
并称之为:
swap(ref sw[0], ref sw[1]);
答案 1 :(得分:2)
应该像下面这样修改它(注意:在这个例子中,ref char[] arr
以ref
为前缀,主要用于说明目的:默认情况下,数组将由ref
传递
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
char[] sw = "ab".ToCharArray();
swap(0, 1, ref sw );
string end = new string(sw);
Console.Write(end);
}
static void swap(int indexA, int indexB, ref char[] arr)
{
char temp = arr[indexA];
arr[indexA] = arr[indexB];
arr[indexB] =temp;
}
}
}
答案 2 :(得分:1)
您的交换采用两种值类型并在变量之间交换值。那里没有什么可以修改原始数组。您需要将交换方法修改为:
static void Swap(char[] array, int a, int b)
{
char temp = array[a];
array[a] = array[b];
array[b] = temp;
}
然后你可以从Main()调用它,如:
Swap(array, 0, 1);
答案 3 :(得分:1)
更通用的数组交换函数:
public static void Swap<T>(this T[] array, int indexA, int indexB)
{
T temp = array[indexA];
array[indexA] = array[indexB];
array[indexB] = temp;
}
还有一个通用函数,用于交换多个数组元素:
public static void Swap<T>(this T[] array, int indexA, int indexB, int length)
{
while (length-- > 0)
Swap(array, indexA++, indexB++);
}
答案 4 :(得分:0)
您正在通过值传递论据a
和b
。
有关详细信息,请参阅What's the difference between passing by reference vs. passing by value?。
以下是解决问题的两种解决方案。
//Pass by value and return the values
static Tuple<char, char> swap2(char a, char b)
{
char temp = a;
a = b;
b = temp;
return new Tuple<char, char>(a, b);
}
//Pass by reference
static void swap3(ref char a, ref char b)
{
char temp = a;
a = b;
b = temp;
}
public static void Main(string[] args)
{
char[] sw2 = "ab".ToCharArray();
var chars2 = swap2(sw2[0], sw2[1]);
sw2[0] = chars2.Item1;
sw2[1] = chars2.Item2;
//Will print "ba"
Console.WriteLine(sw2);
char[] sw3 = "ab".ToCharArray();
swap3(ref sw3[0], ref sw3[1]);
//Will print "ba"
Console.WriteLine(sw3);
}
以下是关于您是应该使用还是尝试避免使用ref关键字的问题。除了最简单的用途之外,通常建议尽可能避免引用。交换属于“最简单的用途”类别,但我建议您在大多数实际情况下尽量避免使用ref。
When is using the C# ref keyword ever a good idea?