Главная » C# » Параметры обычных типов в Visual C# (Sharp)

0

Другое ограничение обычных типов связано с особенностями хранения и манипирования переменными, когда они передаются методом. Допустим, что вы созди метод с параметрами обычного и ссылочного типов. Если в методе параметры модифицируются, то какие модификации будут видны вызывающему компоненту? Рассмотрим следующий код:

static void Method(MyValueType value, MyReferenceType reference)

{

value, value = 10; reference.value = 10;

}

Вызывающий компонент может передать  методу экземпляры обычного и ссылоого типов, которые внутри метода подвергаются манипуляциям. Теперь вызовем метод Method () следующим кодом:

MyValueType value = new MyValueType(); MyReferenceType reference = new MyReferenceType(); Method(value, reference);  Console.WriteLine("value value=" + value.value +

" reference value=" + reference.value);

Вызывающий код создает экземпляры типов MyValueType И MyReferenceType, вывает метод Method (), после чего исследует значение элементов данных обычного и ссылочного типов.

Результат выполнения кода будет следующим:

value value=0 reference value=10

Как можно видеть, элемент данных обычного типа (MyVaiueType) не был изменен, в то время как элемент данных ссылочного типа (MyReferenceType) был  изменен. Это правильный результат, который демонстрирует, что при вызове метода его паметры назначаются переменным в вызываемом методе. Обратясь к табл. 4.1, можно видеть, что при присвоении значения обычному типу последующее манипирование присвоенным экземпляром не влияет на первоначальный экземпляр.

Это означает, что модифицирование обычных типов в методе не отражается вне метода. Поэтому на практике в большинстве случаев  нужно использовать ссылоые типы. Но среда CLR предлагает решение данной проблемы в виде ключевого слова out, которое применяется при вызове метода (рис. 4.6). Оно указывает, что переменная назначается по возвращению метода, а не при его вызове.

Рис. 4.6. Использование ключевого слова out при передаче параметров

Позитивный аспект использования ключевого слова out состоит в том, что в методе переменной можно задать значение, и вызывающий код будет видеть эти измения. Недостатком же является то обстоятельство, что ключевое слово out игнорует назначения параметров вызывающим методом. Параметры обычного типа можно переслать в метод и получить их модифицированные значения из метода подобно параметрам ссылочного типа с помощью ключевого слова ref, как покано в следующем коде:

static void Method(ref MyValueType value, MyReferenceType reference) { value.value = 10;

reference.value = 10;

}

MyValueType value = new MyValueType(); MyReferenceType reference = new MyReferenceType(); Method(ref value, reference); Console.WriteLine("value value=" + value.value +

" reference value=" + reference.value);

При использовании ключевого слова ref обычный тип преобразуется в ссылочный, поэтому, чтобы вызвать метод MethodO, переменной должен быть присвоен дейсительный экземпляр класса обычного типа.

ПРИМЕЧАНИЕ

По тому, как используются  ключевые слова  out и  ref, можно видеть, что С# являея явно определенным языком. Ключевые слова out и ref указываются как при обвлении метода, так и при его вызове. Программируя в С#, вы всегда знаете, что дает любой параметр, метод, переменная или  класс и как они это делают.  Благодаря этой определенности, разработчики могут читать и понимать код, созданный другими разработчиками.

Теперь, когда мы понимаем принцип работы алгоритма поиска в глубину и знаем, как определить структуру данных в виде пользовательского обычного типа, мы можем приступить к реализации самого поискового алгоритма.

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии