Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Метод в C#, меняющий местами значения переменных

#c_sharp #алгоритм #методы


Я новичок в программировании на C#, попался вопрос про обмен значениями переменных
без использования третьей. С одним из решений все понятно:

int a = 2; 
int b = 4;
a = a + b;
b = a - b;
a = a - b;


У меня другой вопрос, можно ли это как-то засунуть в метод? Написал так:

class Program
{
    public static void Main(string[] args)
    {

        Console.WriteLine("Введите значения переменных a и b");
        Console.Write("a = ");

        int x = int.Parse(Console.ReadLine());

        Console.Write("b = ");

        int y = int.Parse(Console.ReadLine());

        SwapNumbers(x, y);
        Console.Write($"Переменная a = {x}, переменная b = {y} ");
        Console.ReadLine();


    }

    public static void SwapNumbers(int a, int b)
    {
        a = a + b;
        b = a - b;
        a = a - b;
    }            
}


Но переменные x и y не меняются местами, по крайне мере в методе Main. Можно сделать так:

public static void SwapNumbers(int a, int b)
    {
        a = a + b;
        b = a - b;
        a = a - b;
        Console.Write($"Переменная a = {a}, переменная b = {b} ");
    }


Но это выглядит как-то коряво и неуместно, потому что я хочу, чтобы метод только
менял местами введенные с клавиатуры значения, а где и когда их вывести я хочу решать сам.
    


Ответы

Ответ 1



Всё дело в том, что ты передаешь копии переменных в метод Swap. Чтобы иметь возможность передавать ссылку есть ключевое слово ref. Т.е. метод будет выглядеть так: public static void Main(string[] args) { int a = 7, b = 5; Console.WriteLine("a -> {0}; b -> {1}", a, b); Swap(ref a, ref b); Console.WriteLine("a -> {0}; b -> {1}", a, b); } public static void Swap(ref int a, ref int b) { a = a + b; b = a - b; a = a - b; } Есть также параметр out. Разница между ref и out тут: ref и out

Ответ 2



Если использовать крайнюю версию языка C#, то можно вытворять вот такой беспредел int a = 10; int b = 15; Console.WriteLine($"{a}-{b}"); (a, b) = (b, a); // обмен Console.WriteLine($"{a}-{b}"); вывод ожидаемо 10-15 15-10

Ответ 3



При передаче в метод по значению (по умолчанию) в метод передается копия переменной, соответственно в вашем коде значения x и y не изменяются. При указании модификатора ref переменные передаются в метод по ссылке, а не по значению. В этом случае при изменении значений переменной в методе будет изменено значение и в вызывающем методе.

Ответ 4



void Swap(ref T a, ref T b){ T temp = a; a = b; b = temp; //Здесь означает что будут использоваться неконкретные типы и мы эти типы и //будем менять местами. При вызове метода нужно использовать такой синтаксис //int a = 0, b = 1; //Swap(ref a,ref b) } Можно в острые скобки (не знаю как их принято называть) вписываем тип переменной и всё.

Комментариев нет:

Отправить комментарий