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

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

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

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

Вполне достаточно, чтобы индексатор обеспечивал функционирование, которое для пользователя выглядело бы,как то, что обеспечивают массивы. Например, следующая программа включает индексатор, который действует подобно массиву, предназначенному только для чтения.Этот "массив" содержит степени числа 2 для чисел от 0 до 15. Однако в действительности никакого массива не существует.

Вместо этого индексатор просто (и быстро)вычисляет соответствующее значение для заданного индекса.// Индексаторы не обязательно должны использовать// реальные массивы.using System;c l a s s PwrOfTwo {/*Доступ к логическому массиву, который содержитстепени числа 2 для чисел от 0 до 15. */public i n t t h i s [ i n t index] {// Вычисляем и возвращаем степень числа 2.get {i f ( ( i n d e x >= 0) && (index < 16)) return pwr(index);e l s e return - 1 ;}//Здесь нет set-аксессора.}int pwr(int p) {int result = 1;for(int i=0; i<p; iresult *= 2;return result;class UsePwrOfTwo {public static void Main() {PwrOfTwo pwr = new PwrOfTwo();Console.Write("Первые 8 степеней числа 2: " ) ;for(int i=0; i < 8; i++)Console.Write(pwr[i] + " " ) ;Console.WriteLine() ;Console.Write("А вот несколько ошибок: " ) ;Console.Write(pwr[-1] + " " + pwr[17]);Console.WriteLine() ;Глава 10.

Индексаторы и свойства263{Вот результаты выполнения этой программы:Первые 8 степеней числа 2: 1 2 4 8 16 32 64 128А вот несколько ошибок: -1 -1Обратите внимание на то, что индексатор класса UsePwrOfTwo включает getаксессор, но обходится без set-аксессора. Это означает, что индексатор предназначентолько для чтения. Таким образом, объект класса UsePwrOfTwo можно использовать вправой части инструкции присвоения, но ни в коем случае не в левой. Например, попытка добавить эту инструкцию в предыдущую программу, обречена на неудачу:I pwr[0] = 11; / / н е скомпилируетсяЭта инструкция вызовет ошибку компиляции, поскольку в индексаторе не определен set-аксессор.На использование индексаторов накладывается два ограничения.

Во-первых, поскольку в индексаторе не определяется область памяти, получаемое индексаторомзначение нельзя передавать методу в качестве ref- или out-параметра. Во-вторых,индексатор должен быть членом экземпляра своего класса, поэтому его нельзя объявлять с использованием ключевого слова s t a t i c .Многомерные индексаторыМожно создавать индексаторы и для многомерных массивов. Например, вот какработает двумерный отказоустойчивый массив. Обратите особое внимание на способобъявления индексатора в этом классе.// Двумерный отказоустойчивый массив.using System;class FailSoftArray2D {int[,] a; // Ссылка на базовый двумерный массив.int rows, cols; // размерностиpublic int Length; // Length - открытый член.public bool errflag; // Индикатор результата// последней операции.// Создаем массив заданного размера,public FailSoftArray2D(int г, int с) {rows = г;cols = с;а = new int[rows, cols];Length = rows * cols;}N// Это индексатор для класса FailSoftArray2D.public int this[int indexl, int index2] {// Это -- get-аксессор.get {if(ok(indexl, index2)) {errflag = false;return a[indexl, index2];} else {errflag = true;return 0;264Часть I.

Язык С#// Это — set-аксессор.set {if(ok(indexl, index2)) {a[indexl, index2] = value;errflag = false;}else errflag = true;// Метод возвращает значение true, если индексы// находятся внутри границ,private bool ok(int indexl, int index2) {if(indexl >= 0 & indexl < rows &index2 >= 0 & index2 < cols)return true;return false;// Демонстрируем использование двумерного индексатора,class TwoDIndexerDemo {public static void Main() {FailSoftArray2D fs = new FailSoftArray2D(3, 5 ) ;int x;// Демонстрируем "мягкую посадку" при ошибках.Console.WriteLine("Мягкое приземление.");for(int i=0; i < 6; ifs[i, i] = i*10;for(int i=0; i < 6; ix = fs[i, i] ;if(x != -1) Console.Write(x + " ") ;}Console.WriteLine();/ / А теперь генерируем ошибки.Console.WriteLine("ХпРабота с уведомлением об ошибках.");for(int i=0; i < б; i++) {fs [i,i] = i*10;if(fs.errflag)Console.WriteLine("fs[" + i + ", " + i + "] вне границ");for(int i=0; i < 6;x = f s [i, i] ;if(!fs.errflag) Console.Write(x + " " ) ;elseConsole.WriteLine("fs[" + i + ", " + i + "] вне границ");Глава 10.

Индексаторы и свойства265Результаты, генерируемые этой программой:Мягкое приземление.О 10 20 О О ОРабота с уведомлением об ошибках.fs[3, 3] вне границfs[4, 4] вне границfs[5, 5] вне границ0 10 20 fs[3, 3] вне границfs[4, 4] вне границfs[5, 5] вне границСвойстваСвойство — это второй специальный тип членов класса, о котором мы собиралисьпоговорить в этой главе. Свойство включает поле и методы доступа к этому полю.Часто требуется создать поле, которое должно быть доступно для пользователей объекта,но программист при этом хочет осуществлять управление операциями, разрешенными квыполнению над этим полем. Например, по некоторым обстоятельствам вы желаете ограничить диапазон значений, которые можно присваивать этому полю. Несмотря на точто этого можно достичь с помощью закрытой переменной и методов доступа к ней,свойство предлагает более удобный и простой способ решения этой задачи.Свойства во многом напоминают индексаторы.

Свойство состоит из имени и парыаксессоров (get и s e t ) . Аксессоры используются для чтения содержимого переменной и записи в нее нового значения. Основное достоинство свойства состоит в том,что его имя можно использовать в выражениях и инструкциях присваивания подобнообычной переменной, хотя в действительности здесь будут автоматически вызыватьсяget- и set-аксессоры. Автоматический вызов аксессоров и роднит свойства с индексаторами.Формат записи свойства таков:ТИПИМЯ{get{// код аксессора чтения поля}set{// код аксессора записи поля}Здесь ТИП — это тип свойства (например, i n t ) , а имя — его имя.

После определения свойства любое использование его имени означает вызов соответствующего аксессора. Аксессор s e t автоматически принимает параметр с именем value, которыйсодержит значение, присваиваемое свойству.Важно понимать, что свойства не определяют область памяти. Следовательно,свойство управляет доступом к полю, но самого поля не обеспечивает. Это поледолжно быть задано независимо от свойства.Рассмотрим простой пример, в котором определяется свойство myprop, используемое для доступа к полю prop. Это свойство позволяет присваивать полю только положительные числа.I// Пример использования свойства,using System;266Часть I.

Язык С#class SimpProp {int prop; // Это поле управляется свойством myprop.public SimpProp() { prop = 0 ; }/* Это свойство поддерживает доступ к закрытойпеременной экземпляра prop. Оно позволяетприсваивать ей только положительные числа. */public int myprop {get {return prop;}set {if(value >= 0) prop = value;// Демонстрируем использование свойства,class PropertyDemo {public static void Main() {SimpProp ob •= new SimpProp ();Console.WriteLine("Исходное значение ob.myprop: " +ob.myprop);ob.myprop = 100; // Присваиваем значение.Console.WriteLine("Значение ob.myprop: " + ob.myprop);// Переменной prop невозможно присвоить// отрицательное значение.Console.WriteLine("Попытка присвоить -10 свойству ob.myprop");ob.myprop = -10;Console.WriteLine("Значение ob.myprop: " + ob.myprop);Результаты выполнения этой программы выглядят так:Исходное значение ob.myprop: ОЗначение ob.myprop: 100Попытка присвоить -10 свойству ob.mypropЗначение ob.myprop: 100На этой программе стоит остановиться подробнее.

В классе SimpProp определяется закрытое поле prop и свойство myprop, которое управляет доступом к полю prop.Как упоминалось выше, свойство само не определяет область хранения поля, а лишьуправляет доступом к нему. Поэтому без определения базового поля определениесвойства теряет всякий смысл. Более того, поскольку поле prop закрытое, к немуможно получить доступ только посредством свойства myprop.Свойство myprop определяется как public-член класса, чтобы к нему можно былообратиться с помощью кода вне класса, включающего это свойство. В этом есть своялогика, поскольку свойство предоставляет доступ к закрытому полю prop с помощьюаксессоров: get-аксессор просто возвращает значение prop, a set-аксессор устанавливает новое значение prop, если оно положительно. Таким образом, свойствоГлава 10. Индексаторы и свойства267myprop управляет тем, какие значения может содержать поле prop. В этом и состоитважность свойств.Свойство тур гор предназначено для чтения и записи, поскольку позволяет какпрочитать содержимое своего базового поля, так и записать в него новое значение.

Номожно создавать свойства, предназначенные только для чтения (определив лишь g e t аксессор) либо только для записи (определив лишь set-аксессор).Мы можем использовать свойство для дальнейшего усовершенствования класса,определяющего отказоустойчивый массив. Как вы уже знаете, с каждым массивомсвязано свойство Length. До сих пор в классе FailSof t A r r a y для этой цели простоиспользовалось открытое целочисленное поле Length. Такое решение — не самоелучшее, поскольку в этом случае можно записать в поле Length значение, отличноеот реальной длины этого массива. (Например, какой-нибудь программист с дурныминаклонностями мог умышленно ввести это значение.) Потенциально опасную ситуацию можно исправить, заменив открытую переменную Length свойством, предназначенным только для чтения, как показано в следующей версии класса FailSof tArray.// Добавляем в класс FailSoftArray свойство Length.using System;class FailSoftArray {int[] a; // Ссылка на базовый массив.int len; // Длина массива, основа для свойства Length.public bool errflag;// Индикатор результата// последней операции.// Создаем массив заданного размера,public FailSoftArray(int size) {a = new i n t [ s i z e ] ;len = size;}// Свойство Length предназначено только для чтения,public int Length {get {return len;// Это -- индексатор класса FailSoftArray.public int this[int index] {// Это -- get-аксессор.get {if(ok(index)) {errflag = false;return a[index];} else {errflag = true;return 0;// Это -- set-аксессор.set {if(ok(index)) {a[index] = value;268'Часть I.

Язык С#errflag = false;}else errflag = true;// Метод возвращает true, если индекс внутри границ,private bool ok(int index) {if(index >= 0 & index < Length) return true;return false;// Демонстрируем улучшенный отказоустойчивый массив,class IinprovedFSDemo {public static void Main() {FailSoftArray fs = new FailSoftArray(5);int x;// Свойство Length можно считывать,for(int i=0; i < fs.Length; i++)fs[i] = i*10;for(int i=0; i < fs.Length; i++) {x = fs[i];if(x != -1) Console.Write(x + " " ) ;}Console.WriteLine();// fs.Length = 1 0 ; // Ошибка, запись запрещена!Теперь Length — это свойство, которое в качестве области памяти использует закрытую переменную len.

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

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

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

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