Метод подкачки в C #, параметры которого имеют тип значения, не эффективен? - PullRequest
1 голос
/ 14 июня 2011

Проверьте этот метод:

public static void Swap(ref int i, ref int j)
{
   int aux=i;
   i=j;
   j=aux;
}

Это более эффективно, чем это?

public static void Swap1(int[] a, int i, int j)
{
   int aux=a[i];
   a[i]= a[j];
   a[j]=aux;
}

Я использую следующие методы:

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

Какой из этих методов более эффективен и почему?

Ответы [ 3 ]

5 голосов
/ 14 июня 2011

Ваш метод не будет менять никакие параметры вообще.Я имею в виду, что это поменяет параметры внутри вашего метода, но это не повлияет на значения параметров источника.Это потому, что типы значений копируются , когда они передаются в методы.Вот пример:

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
}

Чтобы ваш метод работал, вы должны передавать типы значений по ссылке так:

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

Здесь вы можете прочитать о значениитипы и способы работы с ними.

Обновление

После вашего обновления.Я не думаю, что должна быть какая-то существенная разница в производительности, пока типы значений не будут упакованы при передаче через ref .Может быть некоторое наказание, когда вы передаете больше параметров, но я не думаю, что это должно быть значительным, вы не увидите разницу.

2 голосов
/ 14 июня 2011

Не проходя мимо ref не будет работать. Так как вы будете влиять только на локальные параметры.

1 голос
/ 14 июня 2011

Ваш код ничего не делает!Когда параметры передаются по значению, вы не можете их изменить.Таким образом, для правильной реализации Swap необходимо пройти по ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...