#c_sharp
Читаю Джон Шарп - Microsoft Visual C#. Подробное руководство - 2017. Разбираю тему с ref и out и там встречается такое примечание: Уже второй, третий раз встречаю слово псевдоним. Собственно вопрос: что такое псевдоним для аргумента в данном контексте или псевдоним в целом.
Ответы
Ответ 1
Смотрите. «Обычные» параметры (без ref/out) передаются в метод по значению. Это значит, что если вы поменяете значение параметра внутри метода, то снаружи этого никто не заметит. (Если вы поменяете не сам параметр ссылочного типа, а его поля/свойства, то это снаружи будет видно, но это уже другая история.) Теперь, если у вас при параметре указан ref, то изменения этого параметра станут видны снаружи. То есть в коде void Change(ref string s) { s = "Хихи"; } string abc = "abc"; Change(ref abc); будет изменена не копия ссылки abc на строку, а сама эта ссылка. Поэтому если вы теперь напишете Console.WriteLine(abc); — то выведено будет именно Хихи. Таким образом, имеется в виду, что s во время выполнения метода как бы просто другое имя (то есть, псевдоним) для имени abc.Ответ 2
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;
Комментариев нет:
Отправить комментарий