|
Программирование >> Обработка исключительных ситуаций
требуется изменить значение каких-либо передаваемых в него величин. В этих случаях используются параметры-ссылки. Признаком параметра-ссылки является ключевое слово ref перед описанием параметра: ref тип имя Пример заголовка метода, имеющего один параметр-ссылку целого типа: void Р( ref int х ) При вызове метода в область параметров копируется не значение аргумента, а его адрес, и метод через него имеет доступ к ячейке, в которой хранится аргумент. Таким образом, параметры-ссылки передаются по адресу (чаще употребляется термин передача по ссылке ). Метод работает непосредственно с переменной из вызывающей функции и, следовательно, может ее изменить, поэтому если в методе требуется изменить значения параметров, они должны передаваться только по ссылке. ВНИМАНИЕ- При вызове метода на месте параметра-ссылки может находиться только ссылка на инициализированную переменную точно того же типа. Перед именем параметра указывается ключевое слово ref. Исходные данные передавать в метод по ссылке не рекомендуется, чтобы исключить возможность их непреднамеренного изменения. Проиллюстрируем передачу параметров-значений и параметров-ссылок на примере (листинг 5.4). Листинг 5.4. Параметры-значения и параметры-ссылки using System; namespace ConsoleApplicationi { class Classl static void P( int a, ref int b ) { a = 44; b = 33; Console.WriteLine( внутри метода {0} {1} , a, b ); static void Main() in t a = 2. b = 4; Console.WriteLineC до вызова P( a, ref b ); Console.WriteLineC после вызова {0} {1} , a, b ); {0} {!} , a, b ): Результаты работы этой программы: :;. вызовз 2 4 -утри метода 44 33 -еле вызова 2 33 Как видите, значение переменной а в функции Main не изменилось, поскольку пе-оеменная передавалась по значению, а значение переменной b изменилось потому, что она была передана по ссылке. Несколько иная картина получится, если передавать в метод не величины значимых типов, а экземпляры классов, то есть величины ссылочных типов. Как вы помните, переменная-объект на самом деле хранит ссылку на данные, расположенные в динамической памяти, и именно эта ссылка передается в метод либо по адресу, либо по значению. В обоих случаях метод получает в свое распоряжение фактический адрес данных и, следовательно, может их изменить. СОВЕТ- Для простоты можно считать, что объекты всегда передаются по ссылке. Разница между передачей объектов по значению и по ссылке состоит в том, что з последнем случае можно изменить саму ссылку, то есть после вызова метода она может указывать на другой объект. Выходные параметры Довольно часто возникает необходимость в методах, которые формируют несколько величин, например, если в методе создаются объекты или инициализируются ресурсы. В этом случае становится неудобным ограничение параметров-ссылок: необходимость присваивания значения аргументу до вызова метода. Это ограничение снимает спецификатор out. Параметру, имеющему этот спецификатор, должно быть обязательно присвоено значение внутри метода, компилятор за этим следит. Зато в вызывающем коде можно ограничиться описанием переменной без инициализации. Изменим описание второго параметра в листинге 5.4 так, чтобы он стал выходным (листинг 5.5). Листинг 5.5. Выходные параметры ,sing System; smespace ConsoleApplicationi class Classl static void P( int a. out int b ) a = 44; b = 33: Console.WriteLineC внутри метода {0} {1} . a, b ); static void MainO Листинг 5.5 (продолжение) int а = 2, Ь; Р( a, out b ) : Console.WriteLineC после вызова {0} {!} , a, b ); При вызове метода перед соответствующим параметром тоже указывается ключевое слово out. СОВЕТ- В списке параметров записывайте сначала все входные параметры, затем - все ссылки и выходные параметры. Давайте параметрам имена, по которым можно получить представление об их назначении. Ключевое слово this Каждый объект содержит свой экземпляр полей класса. Методы находятся в памяти в единственном экземпляре и используются всеми объектами совместно, поэтому необходимо обеспечить работу методов нестатических экземпляров с полями именно того объекта, для которого они были вызваны. Для этого в любой нестатический метод автоматически передается скрытый параметр this, в котором хранится ссылка на вызвавший функцию экземпляр. В явном виде параметр this применяется для того, чтобы возвратить из метода ссылку на вызвавший объект, а также для идентификации поля в случае, если его имя совпадает с именем параметра метода, например: < class Demo double у; public Dno TO метод возвращает сстлку на экземпляр У- return this; Ц public void Sety( double у ) this.у = у; полю у присваивается значение параметра у Конструкторы Конструктор предназначен для инициализации объекта. Он вызывается автоматически при создании объекта класса с помощью операции new. Имя конструктора совпадает с именем класса. Ниже перечислены свойства конструкторов: Конструктор не возвращает значение, даже типа void.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |