Главная » Просмотр файлов » Г. Шилдт - Полный справочник по C#

Г. Шилдт - Полный справочник по C# (1160789), страница 37

Файл №1160789 Г. Шилдт - Полный справочник по C# (Г. Шилдт - Полный справочник по C#) 37 страницаГ. Шилдт - Полный справочник по C# (1160789) страница 372019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 37)

Строгоговоря, сама ссылка передается по значению. Таким образом, здесь выполняется копирование ссылки, после чего, как мы уже знаем, изменения, вносимые в параметр,не окажут влияния на аргумент. (Например, если заставить параметр ссылаться на новый объект, это не коснется объекта, на который ссылается аргумент.) Однако(внимание, это очень важно) изменения, вносимые в объект, на который ссылаетсяпараметр, повлияют самым прямым образом на объект, на который ссылается аргумент. Давайте разберемся, почему так происходит.Вспомните, что при создании переменной типа класса вы создаете лишь ссылку наобъект. Следовательно, при передаче этой ссылки методу параметр, который получаетее, будет ссылаться на тот же объект, на который ссылается и аргумент.

Это как разозначает, что объекты передаются методу посредством вызова по ссылке. Как следствие, изменения в объекте внутри метода влияют на объект, используемый в качествеаргумента. Рассмотрим, например, следующую программу:// Демонстрация передачи объектов по ссылке.using System;class Test {public int a, b;public Test(int i, int j) {a = i;b = j;}/* Передаем объект.

Теперь ob.a и ob.b в объекте,используемом при вызове, будут изменены. */public void change(Test ob) {ob.a = ob.a + ob.b;ob.b = -ob.b;class CallByRef {public static void Main() {Test ob = new Test(15, 20);Console,WriteLine("ob.a и ob.b перед вызовом:ob.a + " " + ob.b);ob.change(ob);Console.WriteLine("ob.а и ob.b после вызова:ob.a + " " + ob.b);IЭта программа генерирует такие результаты:ob.a и ob.b перед вызовом: 15 20ob.a и ob.b после вызова: 35 -20190Часть I. Язык С #Как видите, в этом случае действия внутри метода change () влияют на объект,используемый в качестве аргумента.Итак, при передаче методу ссылки на объект сама ссылка передается посредствомвызова по значению.

И поэтому делается копия этой ссылки. Но поскольку передаваемое значение ссылается на некоторый объект, копия этого значения ссылается натот же объект.Использование r e f - и out-параметровВыше мы рассмотрели пример, в котором значения нессылочного типа (например,i n t или char) передавались методу по значению. И мы убедились в том, что изменения, вносимые в параметр, который получает значение нессылочного типа, не влияетна реальный аргумент, используемый при вызове метода.

Однако такое поведениеможно изменить. Используя ключевые слова r e f и out, можно передать значениелюбого нессылочного типа по ссылке. Тем самым мы позволим методу изменить аргумент, используемый при вызове.Прежде чем вникнуть в механизм использования ключевых слов ref и out, стоитпонять, когда может потребоваться передача нессылочного типа по ссылке.

В общемслучае существует две причины: позволить методу менять содержимое его аргументовили возвращать более одного значения. Рассмотрим подробно каждую из причин.Часто программисту нужен метод, способный оперировать реальными аргументами, передаваемыми ему при вызове. Классическим примером служит метод swap ( ) ,который меняет местами значения двух аргументов. При передаче значений нессылочного типа по значению невозможно написать метод обмена значениями двух аргументов, например типа i n t , используя действующий по умолчанию С#-механизм передачипараметров по значению.

Эта проблема решается с помощью модификатора ref.Как вы знаете, инструкция r e t u r n позволяет методу возвратить значение тому,кто сделал вызов. Однако метод может вернуть в результате одного вызова только однозначение. А как быть, если нужно вернуть два или больше значений? Например, нужен метод, который разбивает вещественное число на целую и дробную части. Ведь вэтом случае метод должен возвратить два значения: целую часть и дробную составляющую. Такой метод невозможно написать, используя только одно возвращаемоезначение.

Вот с этой проблемой и помогает справиться модификатор out.Использование модификатора r e fМодификатор параметра ref заставляет С# организовать вместо вызова по значению вызов по ссылке. Модификатор ref используется при объявлении метода и еговызове. Рассмотрим простой пример. Следующая программа создает метод sqr (), который возвращает квадрат целочисленного аргумента. Обратите внимание на использование и расположение модификатора ref.// Использование модификатора ref для передачи// значения нессылочного типа по ссылке.using System;class RefTest {/* Этот метод изменяет свои аргументы.Обратите внимание на использование модификатора ref.public void sqr(ref i n t i) {i = i * i;Глава 8.

Подробнее о методах и классах*/191class RefDemo {public static void Main() {RefTest ob = new RefTestO;int a = 10;Console.WriteLine("а перед вызовом: " + a ) ;ob.sqr(ref a ) ; // Обратите внимание/ / н а использование модификатора ref.Console.WriteLine("а после вызова: " + а ) ;|Обратите внимание на то, что модификатор стоит в начале объявления параметра вметоде и предшествует имени аргумента при вызове метода. Приведенные ниже результаты выполнения этой программы подтверждают, что значение аргумента а действительно было модифицировано методом sqr ().а перед вызовом: 10а после вызова: 100Используя модификатор ref, можно написать метод, который меняет значениядвух аргументов нессылочного типа.

Например, рассмотрим программу, которая содержит метод swap (), меняющий значения двух целочисленных аргументов, передаваемых ему при вызове.// Обмен значениями двух аргументов.using System;class Swap {// Этот метод меняет местами значения своих аргументов,public void swap(ref int a, ref int b) {int t;t = a;a = b;b = t;class SwapDemo {public static void Main() {Swap ob = new Swap();int x = 10, у = 20;Console.WriteLine("x и у перед вызовом:х + " " + у) ;ob.swap(ref x, ref y) ;Console.WriteLine("x и у после вызова:х + " " + у) ;192Часть I. Язык С#|Вот результаты выполнения этой программы:х и у перед вызовом: 10 20х и у после вызова: 20 10И еще одно немаловажное замечание. Аргументу, передаваемому методу "в сопровождении" модификатора ref, должно быть присвоено значение до вызова метода.Дело в том, что, если метод получает такой аргумент, значит, параметр ссылается надействительное значение.

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

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

К счастью, в С# предусмотрена альтернатива получше, а именно использование модификатора out.Модификатор out подобен модификатору r e f за одним исключением: его можноиспользовать только для передачи значения из метода. Совсем не обязательно (и дажене нужно) присваивать переменной, используемой в качестве out-параметра, начальное значение до вызова метода. Более того, предполагается, что out-параметр всегда"поступает" в метод без начального значения, но метод (до своего завершения) обязательно должен присвоить этому параметру значение. Таким образом, после обращенияк методу out-параметр будет содержать определенное значение.Перед вами пример использования out-параметра. В классе Decompose методp a r t s () разбивает вещественное число на целую и дробную части. Обратите внимание на то, как возвращается автору вызова этого метода каждый компонент.// Использование модификатора o u t .using System;class Decompose {/* Метод разбивает число с плавающей точкой нацелую и дробную части.

*/public int parts(double n, out double frac) {int whole;whole = (int) n;frac = n - whole; // Передаем дробную часть// посредством параметра frac.return whole; // Возвращаем целую часть числа.c l a s s UseOut {p u b l i c s t a t i c void Main() {Decompose ob = new Decompose();Глава 8.

Подробнее о методах и классах193int i;double f;i = ob.parts(10.125, out f ) ;Console.WriteLine("Целая часть числа равна " + i ) ;Console.WriteLine("Дробная часть числа равна " + f ) ;(При выполнении этой программы получаем такие результаты:Целая часть числа равна 10Дробная часть числа равна 0.125Метод p a r t s () возвращает два значения. Целая часть числа п возвращается с помощью инструкции r e t u r n . Дробная часть числа п передается автору вызова посредством out-параметра f гас. Как показывает этот пример, используя out-параметр,можно добиться того, чтобы метод возвращал не одно, а два значения.Более того, синтаксис языка С# не ограничивает вас использованием только одного out-параметра.

Метод может возвращать посредством out-параметров столькозначений, сколько вам нужно. Ниже приводится пример использования двух o u t параметров. Метод isComDenomO выполняет две функции. Во-первых, он определяет, существует ли у двух заданных целых чисел общий множитель. При этом методвозвращает значение t r u e , если такой множитель существует, и значение f a l s e впротивном случае. Во-вторых, если эти числа таки имеют общий множитель, методisComDenomO с помощью out-параметров возвращает наименьший и наибольшийобщие множители.// Демонстрация использования двух out-параметров.u s i n g System;class Num {/* Метод определяет, имеют ли х и v общий множитель.Если да, метод возвращает наименьший и наибольшийобщие множители в out-параметрах.

*/public bool isComDenom(int x, int у,out int least,out int greatest) {int i;int max = x < у ? x : y;bool first = true;least = 1;greatest = 1;// Находим наименьший и наибольший общие множители.for(i=2; i <= max/2 + 1; i++) {if( ((y%i)==0) & ((x%i)==0) ) {if(first) {least = i;first = false;}greatest = i;if(least194!= 1) return true;Часть I. Язык С#else return false;c l a s s DemoOut {public s t a t i c void Main() {Num ob = new Num();i n t led, gcd;if(ob.isComDenom(231, 105, out led, out gcd)) {Console.WriteLine("Led для чисел 231 и 105 равен " +led) ;Console.WriteLine("Gcd для чисел 231 и 105 равен " +gcd) ;}elseConsole.WriteLine("Для чисел 35 и 4 9 общего множителя нет.");if(ob.isComDenom(35, 51, outConsole.WriteLine("Led дляled) ;Console.WriteLine("Gcd дляgcd) ;}elseConsole.WriteLine("Для чисел 35 и 51led, out gcd)) {чисел 35 и 51 равен " +чисел 35 и 51 равен " +общего множителя нет.");Обратите внимание на то, что в функции Main() переменным led и gcd не присваиваются значения до вызова функции isComDenomO.

Это было бы ошибкой, еслибы эти переменные были не out-, a ref-параметрами. Этот метод в зависимости отсуществования общих множителей у заданных двух чисел возвращает либо t r u e , либоf a l s e . Причем, если общие множители существуют, то наименьший и наибольшийиз них возвращаются в out-параметрах l e d и gcd, соответственно. (Led — это аббревиатура от least common denominator, т.е.

Характеристики

Тип файла
PDF-файл
Размер
24,15 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6458
Авторов
на СтудИзбе
304
Средний доход
с одного платного файла
Обучение Подробнее