
- •Оглавление
- •Об авторе
- •Посвящение
- •Благодарности
- •Ждем ваших отзывов!
- •Что такое .NET
- •Создание исходной программы
- •Тестовая поездка
- •Каркас программы
- •Комментарии
- •Введение в хитрости панели элементов
- •Повторное использование кода из панели элементов
- •Правила объявления переменных
- •Вариации на тему int
- •Объявление переменной с плавающей точкой
- •Ограничения переменных с плавающей точкой
- •Объявление переменных типа decimal
- •Сравнение десятичных и целых чисел, а также чисел с плавающей точкой
- •Логичен ли логический тип
- •Символьные типы
- •Что такое тип-значение
- •Неизменяемость строк
- •Основные операции над строками
- •Сравнение строк
- •Сравнение без учета регистра
- •Отличие строк в разных регистрах
- •Преобразование символов строки в символы верхнего или нижнего регистра
- •Поиск в строках
- •Как искать
- •Пуста ли строка
- •Удаление пробельных символов
- •Анализ числового ввода
- •Обработка последовательности чисел
- •Объединение массива строк в одну строку
- •Арифметика
- •Простейшие операторы
- •Порядок выполнения операторов
- •Оператор инкремента
- •Сравнение чисел с плавающей точкой
- •Составные логические операторы
- •Вычисление типа операции
- •Типы при присваивании
- •Перегрузка операторов
- •Ветвление с использованием if и switch
- •Инструкция if
- •Инструкция else
- •Как избежать else
- •Вложенные инструкции if
- •Конструкция switch
- •Циклы
- •Цикл без счетчика
- •Правила области видимости
- •Пример
- •Зачем нужны разные циклы
- •Зачем нужны массивы
- •Массив фиксированного размера
- •Массив переменного размера
- •Свойство Length
- •Инициализация массивов
- •Понятие <т>
- •Обобщенные коллекции
- •Инстанцирование пустого списка
- •Создание списка целых чисел
- •Преобразования списков в массивы и обратно
- •Подсчет количества элементов в списке
- •Поиск в списках
- •Инициализаторы массивов и коллекций
- •Выполнение специфичных для множеств задач
- •Создание множества
- •Добавление элемента в множество
- •Выполнение объединения
- •Пересечение множеств
- •Получение разности
- •Не используйте старые коллекции
- •Обход каталога файлов
- •Начало программы
- •Получение начальных входных данных
- •Создание списка файлов
- •Форматирование вывода
- •Вывод в шестнадцатеричном формате
- •Обход коллекций: итераторы
- •Доступ к коллекции: общая задача
- •Использование foreach
- •Формат индексатора
- •Блок итератора
- •Создание каркаса блока итератора
- •Итерирование дней в месяцах
- •Что же такое коллекция
- •Синтаксис итератора
- •Блоки итераторов произвольного вида и размера
- •Обобщенные классы безопасны
- •Обобщенные классы эффективны
- •Очередь с приоритетами
- •Распаковка пакета
- •Написание обобщенного кода
- •Использование простого необобщенного класса фабрики
- •Незавершенные дела
- •Ковариантность
- •Использование механизма исключений для сообщения об ошибках
- •Что происходит при генерации исключения
- •Исключительный пример
- •Что делает этот пример "исключительным"
- •Трассировка стека
- •Советы по написанию кода с хорошей обработкой ошибок
- •Анализ возможных исключений метода
- •Как выяснить, какие исключения генерируются теми или иными методами
- •Генерирующие исключения выражения
- •Работа с перечислениями
- •Создание перечислений с инициализаторами
- •Указание типа данных перечисления
- •Применение перечислений в конструкции switch
- •Процедурные поездки
- •Объектно-ориентированные поездки
- •Определение класса и объекта
- •Определение класса
- •Что такое объект
- •Различие между объектами
- •Работа со ссылками
- •Классы, содержащие классы
- •Определение константных членов-данных и членов-данных только для чтения
- •Передача аргументов методу
- •Передача методу нескольких аргументов
- •Соответствие определений аргументов их использованию
- •Перегрузка методов
- •Реализация аргументов по умолчанию
- •Возврат значения оператором return
- •Кортеж с двумя элементами
- •Создание кортежей более чем с двумя элементами
- •Глава 14 Поговорим об этом
- •Определение методов
- •Определение статического метода
- •Определение метода экземпляра
- •Полное имя метода
- •Ключевое слово this
- •Когда this используется явно
- •Что делать при отсутствии this
- •Использование локальных функций
- •Прочие уровни безопасности
- •Методы доступа
- •Пример управления доступом
- •Выводы
- •Статические свойства
- •Побочные действия свойств
- •Дайте компилятору написать свойства для вас
- •Методы и уровни доступа
- •Замена конструктора по умолчанию
- •Конструирование объектов
- •Непосредственная инициализация объекта
- •Конструирование с инициализаторами
- •Инициализация объекта без конструктора
- •Определение свойств с кодом
- •Определение конструкторов и деструкторов с кодом
- •Определение методов доступа к свойствам с кодом
- •Определение методов доступа к событиям с кодом
- •Наследование класса
- •Более сложный пример наследования
- •ЯВЛЯЕТСЯ или СОДЕРЖИТ
- •Доступ к BankAccount через содержание
- •Отношение СОДЕРЖИТ
- •Заменяемость классов
- •Неверное преобразование времени выполнения
- •Указание конкретного конструктора базового класса
- •Обновленный класс BankAccount
- •Перегрузка унаследованного метода
- •Простейший случай перегрузки метода
- •Различные классы, различные методы
- •Сокрытие метода базового класса
- •Вызов методов базового класса
- •Что неверно в стратегии использования объявленного типа
- •Использование is для полиморфного доступа к скрытому методу
- •Объявление метода виртуальным и перекрытие
- •Получение максимальной выгоды от полиморфизма
- •Разложение классов
- •Абстрактный класс: ничего, кроме идеи
- •Как использовать абстрактные классы
- •Создание абстрактных объектов невозможно
- •Опечатывание класса
- •Реализация интерфейса
- •Именование интерфейсов
- •Наследование и реализация интерфейса
- •Преимущества интерфейсов
- •Тип, возвращаемый методом
- •Что скрыто за интерфейсом
- •Гибкие зависимости через интерфейсы
- •Реализация отношения СОДЕРЖИТ с помощью интерфейсов
- •Определение делегата
- •Пример передачи кода
- •Делегирование задания
- •Очень простой первый пример
- •Более реальный пример
- •Создание приложения
- •Жизненный цикл делегата
- •Анонимные методы
- •Проектный шаблон Observer
- •Что такое событие. Публикация и подписка
- •Как издатель оповещает о своих событиях
- •Как подписаться на событие
- •Как опубликовать событие
- •Как наблюдатели "обрабатывают" событие
- •Сборки
- •Выполнимые файлы
- •Библиотеки классов
- •Создание проекта библиотеки классов
- •Создание автономной библиотеки классов
- •Создание классов для библиотеки
- •Использование тестового приложения
- •Дополнительные ключевые слова для управления доступом
- •protected: поделимся с подклассами
- •protected internal: более изощренная защита
- •Размещение классов в пространствах имен
- •Объявление пространств имен
- •Пространства имен и доступ
- •Использование полностью квалифицированных имен
- •Ссылочные типы
- •Выходные параметры
- •Альтернативные методы возврата значений
- •Работа с переменными out
- •Возврат значений по ссылке
- •Различия типов-значений
- •Когда следует использовать структуры
- •Добавление распространенных элементов структур
- •Управление отдельной записью
- •Добавление структур в массивы
- •Перекрытие методов
- •Определение того, что следует защищать
- •Документирование компонентов программы
- •Разложение компонентов на функции
- •Оценка рисков
- •Аутентификация с использованием входа в Windows
- •Безопасность развертывания
- •Уязвимости сценариев
- •Наилучшие методы защиты приложений Web Forms
- •Получение данных
- •Настройка образца схемы базы данных
- •Подключение к источнику данных
- •Работа с визуальными инструментами
- •Написание кода для работы с данными
- •Использование Entity Framework
- •Где водится рыба: файловые потоки
- •Потоки
- •Читатели и писатели
- •Пример использования потока
- •Как это работает
- •Наконец-то мы пишем!
- •Использование конструкции using
- •Загрузка файла из Интернета
- •Регистрация сетевой активности
- •Графика
- •Перья
- •Кисти
- •Текст
- •Классы рисования и каркас .NET
- •Приступая к работе
- •Настройка проекта
- •Обработка счета
- •Создание подключения к событию
- •Рисование доски
- •Запуск новой игры

Возврат значения оператором return |
|
||||
519N--44-8N0L-- |
50 |
8-41Bп-д-N4- |
п--IBп0N-8-4Bп515j-йB 4-l-Lr |
||
ш-r 8-п-N 9-n950 |
0А |
1rB5-N4--n40 -41- |
-5-N044S-д8j 05 |
j8-йм-9 |
t
44 |
|
01N |
|
-4N |
|
9-В |
|
57N |
88N |
||
-4 |
|
B4В |
|
4 4 В -IN |
- - N |
14В |
5-tN-9B- |
--l50п1п- 9418041-40й- |
п-8-п-N -l |
9Н-С40I |
|
||||||||
|
|
к к |
п1к |
к-5-N18-4-8 8-п-N0jI0nS90-п40й-й |
|
|||||||
0I |
п-8-п-N |
к 9-n950к |
-й0 9SnS90А |
-8j8-п-Nj n40 |
-м1п-1 |
0 |
||||||
|
к -й-N |
|
к |
1Bк |
-rnjL-й18-40 |
1 |
NL n40 |
1r-м |
-5N044S- |
д |
||
-8j 9I0 |
-Bй905- |
j8-4п-9 |
4B-nN0-й -5-8-ммjА |
к I-п-5-кr |
S51B90 |
|||||||
190-пB5-N4--n40 |
-41- й1д -5-8-44Sд |
0п8n40 -41B- -N-5t0 |
--B 9 - |
|||||||||
5-8-44-r |
к |
9-n950к 0-йB9SnS90А |
-8j8-й-Njю |
|
|
|
|
|||||
|
РОНОRННЕЕМЗССМИОR!НRОПОНС. !СО •ЕИСО! ПОКПНН!НИВ !rТЕХ,!.ТЕХ\ВОТЕХ |
|||||||||||
|
ИИПОННИПС!ОИПСНН!И!МИ |
ПОНМВВМВО. nИНИ!НИСЗСМ!М ПОКПНН!НИСm |
||||||||||
|
ЗС !rТЕХ,!.ТЕХМ!ММ!НС nИНИЕИИИНС. |
ИИСОМИО! !НИ!ОЕ З!ЕМНИПСКСm |
||||||||||
ВНИМАНИВ |
ПНР!ИЕЕ |
ЕИСО!Е ПОКПНН!НИСЗСЗТЕМАЗТИЗМТЗО!ИН!Н!ИИЗС П nИНИЕИИ |
|
|||||||||
|
ИОЗ !rТЕХ,!.ТЕХ. |
|
|
|
|
|
|
|
|
|||
!СКОП hrТЕХ,! .ТЕХl n МКЕИСО!Н ТЕХРl n ПСR!С!МВ СН! !И. |
ПНПМПСКОП!РЗО |
|
||||||||||
RО !НЕRОRОЕИВО!Н |
О!ИН!О КИНМИИМИВМnН .g, |
ТЕХПОКПНН. |
!НИЕОИЕИСО!ОЕ |
|
hrТЕХ,!.ТЕХl n .ЗОТННИСИСЗСПnИНИЕИИИОЗ!rТЕХ,!.ТЕХ!·,ТЕХ
ИСО!.ПОСОНСЗ ПОКПНН!НИС КИН!И!МИ-ПН!. ИНnНМЕИН.hrТЕХ,!.ТЕХ !1nИИ ЕО!ИС КНПИНТМВВЗ nНОЗСОnО!ОЗСМ!И!ММ КНПНСПНР!ИЗ !МRЕНИОЗ
З!ОЗПМ. nОЗПО!ВПЕА, ЗОПИНТИИИОИИnОИСВИО•!НПОИ!И МЕИИ!О КИНm ЗАПОМНИ! !ИИМИ!О!!И! ЗЕ!ИС ПИНИЕСВ СОВЕИСО!ОСТFS\11ТS!СВОRОЗСКНСИ!ВИОИН!Мo
ММИОnИННСОНН,ТЕХЧ,,Е!d
, СС ЧАСТЬ 2 зчsрьяоеъееПрояПеемиооер кееeеиддПеемиоПрои тл

Определение метода без возвращаемого значе·ния
г |
·пдИЗд |
|
|
|
|
|
|
|
|
|
зк |
жПтждгд |
|||||
гзв |
|
|
а·а Пз |
П |
·с |
Зн |
И·хдИЗдгЗг· |
|
вИ·азСи |
дСгПисг |
|||||||
Одгзвг ИдПз |
П |
· |
·с |
ЗдИЗхд |
з |
·ИддПг Сг·таЗП·тЗСм С г |
ЗОд |
зОг·аз |
з |
||||||||
Одгзв· |
|
|
|
|
|
|
азгз |
гнПгПзвЗт ПгхЗСтдИИздС |
двИддИ·хд |
||||||||
ИЗдИ· |
а ·ИЗхд ИдзПз |
П · Пг·ж гП·с дОиОдгзви |
ОдСгзгз з хгзкг |
||||||||||||||
згиСгЗгмП зк |
жПтдИЗЗг·аз |
зОдгзв· гЗг Пз П ·дОз з И·хдИЗжП |
|
иа· |
|
||||||||||||
гП·дгСж |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
О |
м |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
тсхдПздСтзПз |
|
игзг дктдИИздПОдСгзЗОдИЗгЗг· |
гз СигЗ з |
И·х· |
|||||||||||||
дг |
|
|
|
|
г |
диа· |
гП·дг хгз Одгзв |
|
|
|
|
ИЗхд |
з |
||||
ИдПз |
П |
· |
·Пдг |
гП·с |
дОиОдгзви |
|
тскзд зк |
жПтдИЗдОдгзв· |
зкж |
·Из |
|||||||
иа· гП·гмПз |
П |
· |
·дОгнЗг |
в·пд дСтЗ |
гз |
|
|
|
|
|
|
|
|||||
|
|
дгзвазгз |
гнИдПз |
П |
· ·дгИ·хдИЗжг |
з ·ООЗСг·ОЗ И· |
|
гП·дг |
|||||||||
|
Сж |
|
|
|
гз ЗСгзтм |
зП·ИИзОиатсхдПзОиСтзПиП д |
згЗ |
|
|||||||||
ЗАПОМНИ! |
С·ИЗЗ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
nДОВ!Сi ИДБПЧБРЧМДЗБr |
a |
ЕДОВ!НЕМПВЧПТНЧНРОЕСТНПЧДИМДПСЧСПН |
|||||||||||||||
РЧДЕЕ |
ЕДОВ!Е СТМПССВЧИДИММВСДТНОВТНТЕХtЧ,ТЕХЧНПВОВТСЕКИ |
ЗЧД!ЕДОПВЧПТНe |
|||||||||||||||
ЧНДЕВД ПСЧСПНРЧДЕЕ ЕДОВ!Е ЧИНМДИМДРОВЗПВЧВПЕ! r |
, |
ЕДОВ! ИДПВЧПТНЧН |
|||||||||||||||
ДОИМПНПВ'ВЧИНМДИМБПСТВ! |
МЧИД'В ВЗЕЧДЗОПЧБДОЗБСВЗТД!ЗОПВЕ ВСДТНОВТН |
ТЕХ,tТЕХЧcЗДЧПНПВ'В ЗС ОВИМЗСЧВ ЧИНМДИМБЧМЗВСТМ!ВЗОМ!ДИММЧНПТСПНРЧДЗ
ОДЧВЕДОВ!Н!М'ЕТИВЗ ЗПВЗПМ! |
НЗЗЕВОТМЕЗЧД!ЕРЧМЗ ЕДОВ! sa p·! |
!Ч,g· |
|||
|
НЕ eВ |
|
" |
Е |
|
|
|
|
|
i |
|
" |
!!o |
P |
|
|
|
|
|
" О |
|
P С |
|
ПОИС. |
! |
|
|
|
|
|
|
|
|
ТЕ |
|
|
.o |
|
О o |
|
|
|
" С |
|
|
||
|
o |
О |
С o |
ЕТ P |
|
|
o С |
О o |
|
||
|
|
|
|
!ЗАЗАЗА, I Методы |
п ллC |

Вы могли заметить, что метод WriteLine ( ) , использовавшийся в рассматри ваемых программах, представляет собой не более чем вызов метода класса
Console:
G |
lэ . ® lы®l iя |
o |
ая к |
Метод WriteLine ( ) - один из множества предопределенных методов, пре доставляемых библиотекой .NET. Console - предопределенный класс, пред назначенный для использования в консольных приложениях.
Аргументом метода WriteLine ( ) , применявшимся в рассмотренных выше примерах, является строка string. Оператор + позволяет программисту со брать эту строку из нескольких строк или строк и переменных встроенных типов, например, так:
G |
wр Q я |
як |
ь t |
t |
).l ® |
lыl®оя'l |
|||
|
|
яэ |
я t w Т ь |
sв я |
В результате вы увидите выведенную на экран строку"Меня зовут Маша, и мне 3 года':
Второй вид метода WriteLine ( ) допускает наличие более гибкого множества аргументов, например:
G |
э.l °":lы°": ilя'l |
ь i |
|
я |
ня eк |
Первый аргумент такого вызова называется форматной строкой. В данном примере строка "Маша " вставляется вместо символов { о } - нуль указывает на первый аргумент после командной строки. Целое число 3 вставляется в позицию, помеченную как { 1 } . Этот вид метода более эффективен, поскольку конкатенация строк не так проста, как это звучит, и не столь эффективна.
Метод DisplayRatio ( ) начинает работу с проверки, не равно ли значение denominator нулю.
»· Если значение denominator равно нулю, программа выводит сооб щение об ошибке и возвращает управление вызывающему методу,
не пытаясь вычислить значение отношения. При попытке вычислить отношение произошла бы ошибка деления на нуль с аварийным остановом программы в результате.
)) Если значение denominator не равно нулю, программа выводит на экран значение отношения. При этом закрывающая фигурная скоб ка после вызова метода WriteLine ( ) является закрывающей скоб кой метода DisplayRatio ( ) и, таким образом, представляет собой точку возврата из метода в вызывающую программу.
зпчи rчянии iи сaфдгтеожо авдетв аот рееодижаощар яяваот ревдиериDси

Если бы это было единственной разницей, не о Однако вторая форма глаnсенааеnи . nпредоставляет форматом вывода, описанных в главе 3, "Работа со
чем было бы много писать.
ряд элементов управления строками".
Возврат нескольких значений с использованием кортежеи
В версиях С# до С# 7.0 каждое возвращаемое значение является отдель ным объектом. Это может быть сложный объект, но это все еще единственный объект. В С# 7.0 можно возвращать из методов несколько значений, используя кортежи. Кортеж - это разновидность динамического массива, номинально содержащего два элемента, которые можно интерпретировать как пару "ключ значение" (но это не обязательно). В С# вы также можете создавать кортежи, содержащие более двух элементов. Многие языки, такие как Python, использу ют кортежи, чтобы упростить кодирование и значительно облегчить работу со значениями.
Фактически С# 4.х ввел концепцию кортежей как часть подхода динамиче ского программирования. Однако С# 7.0 продвигает использование кортежей, позволяющих возвращать несколько значений, а не только один объект. Под робный обзор кортежей выходит за рамки данной к ниги, но они так хорошо работают при возврате сложных данных, что вам, определенно, необходимо знать кое-что об этом их применении.
Кортеж с двумя элементами
Кортеж основан на типе данных nпW меinкоторый может принимать одно или два входных данных, причем наиболее распространенными являются кортежи с двумя элементами (в противном случае вы можете просто вернуть единствен ный объект). Лучший способ работы с кортежами - предоставить типы дан ных переменных, с которыми вы планируете работать, как часть объявления. Вот пример метода, который возвращает кортеж:
щ B:)тum,( |
х1i:им:им S1, |
B |
r,т o v |
||
eж |
|
|
|
|
|
цц |
хим, |
B тr,( |
ц;им1, |
;им |
nSн I,wwр н i : и is V |
х, |
Код начинается с указания того, что :е слкЛмnnц Lвозврn ащает кортеж лпхмеn из двух элементов с типами нслаа:nи аасеnКлючевое слово аnanиспользует ся для создания экземпляра лпхiеEnс типами данных, описанными в угловых скобках, (нслаа:вnаасНinи указанными значениями данных. Метод :евлпхмеnа . n
ГЛАВА 1 3 Методы 303

|
ЕТТ!ПT1!!ЧЕИВ |
О!СЕТВ!ЧТ!1!!ПНВЕТ !!1!СЧ |
ЧЕТTВ!Ч 1ЕЧPВЕИН ЕВ ТСИ |
|
|
ЕТВ!ЧНО ЕТП!!ЕТЗ ЕТИТЧЗВЧЕЕТr ИПИВСR!ИЗ ЕТЕТСЧЕЕТЗЕТЕТСR!ЕТRСЧЗl |
|||
|
cЕТ! ВВПЧВЕТ! i |
!!В ТС! В О!!ВЧ ЕТСВЕТ!!ЧЕИНО!Тr !ВЕТЗ ВЧЕЕТЗ |
||
СОВЕТ |
!ТИЕТЕ!Ч3ЕТЕТН! СЧЗОИ!!СЕТВ!ЧlrЧТСИЗВСcТСИ!ТТ !ПЕВЕИИ !ТСВВВ): |
|||
|
|
|
|
|
|
ПВЕЕТr ЗЧЕТВЗЧЕТИPВЕТ!И!ТВСЧr |
ИИЗ!!ВЕТ ЕТТЕТЕВT!ЕТr!ВИЗ! !ВСЕRЕТT |
||
|
СВ1RПTЕТЧЕТИ!ЕТЕТЧ!ОИПИ!ВoВЕТЕТ!ВЕЕR3 |
И ЗЕИЗR3 PЧЕТЕТИ!!ЗТПВОЕТ): |
||
|
Е!!! PИЕТПЧ.ti |
|
|
|
Применение метода Create ( )
.b.#,2V .(6 2l3 iS1i12 |
i12.V2(1 |
|
n1,.#6V |
(iS |
1.b216V2(# |
-#.1.V |
|||
rnSeimS |
#2art.b.VS1. .arкV#.i1 .Vn13 6#я .V. S,( ,V21.# |
i |
-#.1.1- |
1S(iV2i |
|||||
2l-6 S,#.l |
.ar |
#-,V2.#.#t th1. S,(-#, |
|
(iS1.b216V2(1 -#.1.V МSeimS |
|||||
|
|
w т |
|
w0 |
0 |
у |
|
|
|
|
|
|
|
|
|
|
|||
|
w |
0 |
3 |
|
у |
|
|
|
|
э.1. S1.F1. 2# .V. 2#21SVi#2 nV. (iS1.b216V2 |
# -#.1.V S1.42V221W1 6 S,#r |
||||||||
.0.ar #-,V2.#.# S1.1-arк.1 |
g.#-#2.l |
э |
S-1War2l. .b |
(2-#2#2l (262#d |
|||||
thn12i.,ar |
-,#1621 (in .7к |
(.b кVi.b |
|
rimoМдТhrдoimhV. .Vn n1-S(.1.1, -1r |
|||||
6#. 601i2 |
. b .(Sl |
g.#-#2.16 |
э |
(2 S#,#.V 22lF 6F1.2 |
F.V22lFt |
304 ЧАСТЬ 2 7Bu.83,# #-..,3.-#.-,,#. 4-#O-...- #.-,.. ,-C

Мноrоэлементные кортежи
Истинная ценность кортежа заключается в создании наборов данных с ис пользованием чрезвычайно простых методов. Вы можете выбрать для просмо тра Iteml в качестве ключа и Item2 в качестве значения. Многие типы наборов данных полагаются на парадигму "ключ-значение", и такая трактовка кортежа делает его невероятно полезным. В следующем примере показаны создание и возврат соответствующего набора данных.
static Tuple<string, int> [ ] getTuple ( )
дt
// Создание нового кортежа . Tuple<string, int> [ ] aTuple
дt new Tuple<string, int> ( "One" , 1 ) , new Tuple<string, int> ( "Two" , 2 ) , new Tuple<string, int> ( "Three " , 3 )
V
// Возврат списка значений с использованием кортежа . return aTuple;
Как и в предыдущем разделе, вы указываете в качестве возвращаемого типа Tuple, но с добавлением пары квадратных скобок ( [ ] ), аналогичных тем, кото рые используются для массива. Квадратные скобки говорят С#, что эта версия getTuple ( ) возвращает несколько кортежей, а не один.
Чтобы создать набор данных, вы начинаете с объявления переменной aтuple. Каждая новая запись в кортеже требует нового объявления кортежа с необходимыми входными данными. Все они помещаются в фигурные скобки. Чтобы вернуть кортеж, как обычно, используется оператор return.
Доступ к кортежу требует использования перечислителя, и вы можете де лать все, что вы обычно делаете с перечислителем, например работать с от дельными значениями с помощью foreach:
static void Main (string [ ] args)
дt |
// Получение набора кортежей . |
|
|
|
|
|||
|
= getTuple ( ) ; |
|||||||
|
Tuple<string, |
int> [ ] myTuple |
||||||
|
// |
Вывод значений . |
in myTuple) |
|
|
|
|
|
|
foreach (var |
Item |
|
|
|
|
||
|
{ |
Console . WriteLine ( Item . Iteml + |
"\t" |
+ |
Item . Item2 ) ; |
|||
|
) |
|||||||
|
Ожидаем подтверждения пользователя |
|
|
|||||
|
// |
" |
+ |
|||||
|
Console . WriteLine ( "Haжмитe <Enter> |
для |
||||||
|
Console . Read ( ) ; |
"завершения программы. . . " ) ; |
||||||
|
|
|
|
|
|
ГЛАВА 1 3 Методы 305