Параметры ref и out

April 7, 2010 by admin Комментировать »

Использовать две функции класса для чтения переменных не всегда удобно. Было бы неплохо получить оба значения при вызове одной функции. Впрочем, функция обладает лишь одним возвращаемым значением.

Решение проблемы заключается в передаче параметров по ссылке (с ключевым словом ref). В этом случае переданные параметры можно модифицировать в функции класса:

// Ошибка

using System;

class Point

{

public Point(int x, int y)

{

this.x = x;

this.y = y;

}

// Получить обе величины при одном вызове функции

public void GetPoint(ref int x, ref int y)

{

x = this.x;

y = this.y;

}

int x;

int y;

}

class Test

{

public static void Main()

{

Point myPoint = new Point(10, 15);

int x;

int y;

// Недопустимо

myPoint.GetPoint(ref x, ref y);

Console.WriteLine("myPoint({0}, {1})", x, y);

}

}

В этом фрагменте параметры были объявлены с ключевым словом ref, которое также присутствует и при вызове функции.

На первый взгляд все правильно, но при попытке откомпилировать программу появляется сообщение об ошибке, в котором говорится, что в параметрах x и y передаются неинициализированные значения. Это означает, что переменные передаются функции до того, как им были присвоены начальные значения. Компилятор не разрешает использовать неинициализированные переменные.

Существует два обходных пути. Во-первых, переменные можно инициализировать при объявлении:

using System;

class Point

{

public Point(int x, int y)

{

this.x = x;

this.y = y;

}

public void GetPoint(ref int x, ref int y)

{

x = this.x;

y = this.y;

}

int x;

int y;

}

class Test

{

public static void Main()

{

Point myPoint = new Point(10, 15);

int x = 0;

int y = 0;

myPoint.GetPoint(ref x, ref y);

Console.WriteLine("myPoint({0}, {1})", x, y);

}

}

Теперь программа успешно компилируется, однако мы обнуляем переменные только для того, чтобы сразу же присвоить им новое значение при вызове GetPoint(). В C# существует другое решение: изменить объявление функции GetPoint() и использовать вместо ref ключевое слово out:

using System;

class Point

{

public Point(int x, int y)

{

this.x = x;

this.y = y;

}

public void GetPoint(out int x, out int y)

{

x = this.x;

y = this.y;

}

int x;

int y;

}

class Test

{

public static void Main()

{

Point myPoint = new Point(10, 15);

int x;

int y;

myPoint.GetPoint(out x, out y);

Console.WriteLine("myPoint({0}, {1})", x, y);

}

}

Параметры out работают точно так же, как и параметры ref, кроме того, что в них разрешается передавать неинициализированные переменные, и при вызове вместо ref указывается ключевое слово out[1].


[1] С позиций других языков .NET не существует различий между параметрами ref и out. Программа C# при вызове функции «увидит» параметры out, но в других языках они будут восприниматься как параметры ref.

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты