Читаю Джон Шарп - Microsoft Visual C#. Подробное руководство - 2017.
Разбираю тему с ref и out и там встречается такое примечание:
Уже второй, третий раз встречаю слово псевдоним.
Собственно вопрос: что такое псевдоним для аргумента в данном контексте или псевдоним в целом.
Смотрите. «Обычные» параметры (без ref/out) передаются в метод по значению. Это значит, что если вы поменяете значение параметра внутри метода, то снаружи этого никто не заметит.
(Если вы поменяете не сам параметр ссылочного типа, а его поля/свойства, то это снаружи будет видно, но это уже другая история.)
Теперь, если у вас при параметре указан ref, то изменения этого параметра станут видны снаружи. То есть в коде
void Change(ref string s)
{
s = "Хихи";
}
string abc = "abc";
Change(ref abc);
будет изменена не копия ссылки abc на строку, а сама эта ссылка. Поэтому если вы теперь напишете
Console.WriteLine(abc);
— то выведено будет именно Хихи.
Таким образом, имеется в виду, что s во время выполнения метода как бы просто другое имя (то есть, псевдоним) для имени abc.
public void Test(int a)
{
// changes to "a" do not affect variable used in Test call
// изменение значения параметра "a" не влияет на значение переменной,
// использованной в качестве аргумента вызова функции
a = a + 1;
}
public void TestRef(ref int a)
{
// changes to "a" do affect variable used in TestRef call
// изменение значения параметра "a" меняет значение переменной,
// использованной в качестве аргумента вызова функции, отсюда - псевдоним
a = a + 1;
}
public void TestOut(out int a)
{
// changes to "a" do affect variable used in TestOut call,
// value assigned to variable before the call is discarded
// присвоение значения параметру "a" присваивает значение переменной,
// использованной в качестве аргумента вызова функции, отсюда - псевдоним;
// значение переменной до вызова функции теряется,
// переменая может быть не инициализирована до вызова функции
// compiler error without this:
// параметр обязательно должен быть инициализирован до
// использования/возврата
a = 2;
a = a + 1;
}
int b = 5;
Test(b); // b = 5
Test(ref b); // b = 6
Test(out b); // b = 3;
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники