#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) } Можно в острые скобки (не знаю как их принято называть) вписываем тип переменной и всё.
Комментариев нет:
Отправить комментарий