C#中的swap方法,其参数值类型效率不高?

Tom*_*duy 1 .net c# parameters methods

检查此方法:

public static void Swap(ref int i, ref int j)
{
   int aux=i;
   i=j;
   j=aux;
}
Run Code Online (Sandbox Code Playgroud)

它比这更有效吗?

public static void Swap1(int[] a, int i, int j)
{
   int aux=a[i];
   a[i]= a[j];
   a[j]=aux;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用这样的方法:

static void Main(string[] args)
{
    int[] a = { 5, 4, 3, 1 };
    Swap(a[1], a[2]);
    Swap(a, 1, 2);
}
Run Code Online (Sandbox Code Playgroud)

哪种方法更有效,为什么?

Dmi*_*nov 5

您的方法根本不会交换任何参数.我的意思是它会在你的方法中交换参数,但它不会影响源参数的值.这是因为值类型在传递给方法时会被复制.这是一个例子:

void IncorrectSwap(int a, int b)
{
    int temp = a;
    a = b;
    b = temp;
}

void HereHappensNothing()
{
    int a = 1;
    int b = 2;
    IncorrectSwap(a, b);
    // a still = 1, and b = 2, nothing happens
}
Run Code Online (Sandbox Code Playgroud)

要使您的方法工作,您必须通过引用传递值类型,如下所示:

void CorrectSwap(ref int a, ref int b)
{
    int temp = a;
    a = b;
    b = temp;
}

void HereSwapHappens()
{
    int a = 1;
    int b = 2;
    CorrectSwap(ref a,ref b);
    // a = 2, and b = 1, Ok.
}
Run Code Online (Sandbox Code Playgroud)

在这里,您可以阅读有关值类型以及如何使用它们的信息.

更新

更新后.我不认为只要值类型在ref传递时没有盒装,就不会有任何性能上的显着差异.传递更多参数可能会有一些惩罚,但我不认为它应该是重要的,你不会看到差异.