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