Читаю Джон Шарп - 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;
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
На одном компьютере всё работаетПеренёс на другой и студия пишет в том месте, где принимаю POST параметры - System