Известно два способа передачи параметров при вызове метода:
§ по значению (в силу специфики механизма передачи параметров только входные),
§ по ссылке (входные и/или выходные).
По значению – БЕЗ спецификаторов (для размерных типов этот способ предполагается по умолчанию). Локальная копия значения в методе. Параметр представляет собой означенную переменную. Его можно использовать в методе наряду с переменными, объявленными в теле метода. Изменение значения параметра НЕ влияет на значение параметра в выражении вызова.
Для организации передачи по ссылке параметра РАЗМЕРНОГО типа требуется явная спецификация ref или out. По ссылке – спецификатор ref (для ссылочных типов предполагается по умолчанию (другого способа передачи параметра для ссылочных типов просто нет), для размерных типов спецификатор необходимо явно указывать).
Параметр по ссылке и параметр по значению – большая разница! Это основание для перегрузки метода!
using System;
class XXX {
public int mmm;
}
class Class1
{//=============================================
static int i;
static void f1 (ref int x)
{
x = 125;
}
static void f1 (int x)
{
x = 0;
}
static void f1 (XXX par)
{
par.mmm = 125;
}
static void f1 (out XXX par)
{
par = new XXX(); // Ссылка на out XXX par ДОЛЖНА быть
// проинициализирована в теле
// метода НЕПОСРЕДСТВЕННО перед обращением к ней!
// Способ инициализации – любой! В том числе и созданием объекта!
// А можно и присвоением в качестве значения какой-либо другой ссылки.
par.mmm = 125;
}
// Для размерного типа параметра метода со списками параметров, которые
// различаются только спецификаторами out - ref
// несовместимы. out – частный случай ссылки.
//static void f1 (out int x)
//{
// x = 125;
//}
static void Main(string[] args)
{//======================================
int a = 0;
f1(ref a);
//f1(out a);
f1(a);
XXX xxx = new XXX();
xxx.mmm = 0;
f1(xxx);
f1(ref xxx);
// По возвращении из метода это уже другая ссылка!