Что такое “псевдоним” для аргумента?

260
02 марта 2017, 22:01

Читаю Джон Шарп - Microsoft Visual C#. Подробное руководство - 2017.

Разбираю тему с ref и out и там встречается такое примечание:

Уже второй, третий раз встречаю слово псевдоним.

Собственно вопрос: что такое псевдоним для аргумента в данном контексте или псевдоним в целом.

Answer 1

Смотрите. «Обычные» параметры (без ref/out) передаются в метод по значению. Это значит, что если вы поменяете значение параметра внутри метода, то снаружи этого никто не заметит.

(Если вы поменяете не сам параметр ссылочного типа, а его поля/свойства, то это снаружи будет видно, но это уже другая история.)

Теперь, если у вас при параметре указан ref, то изменения этого параметра станут видны снаружи. То есть в коде

void Change(ref string s)
{
    s = "Хихи";
}
string abc = "abc";
Change(ref abc);

будет изменена не копия ссылки abc на строку, а сама эта ссылка. Поэтому если вы теперь напишете

Console.WriteLine(abc);

— то выведено будет именно Хихи.

Таким образом, имеется в виду, что s во время выполнения метода как бы просто другое имя (то есть, псевдоним) для имени abc.

Answer 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;
READ ALSO
System.InvalidOperationException: “Incorrect Content-Type”

System.InvalidOperationException: “Incorrect Content-Type”

На одном компьютере всё работаетПеренёс на другой и студия пишет в том месте, где принимаю POST параметры - System

333