Г. Шилдт - Полный справочник по C# (1160789), страница 6
Текст из файла (страница 6)
от выражения "yust-/n-rime", означающеговыполнение точно к нужному моменту (так обозначается стратегия принятия решений в самый последний подходящий для этого момент в целях обеспечения их максимальной точности). Этот процесс работает следующим образом. При выполнении.NET-программы CLR-система активизирует ЛТ-компилятор, который преобразуетMSIL-код в ее "родной" код на требуемой основе, поскольку необходимо сохранитькаждую часть программы. Таким образом, Сопрограмма в действительности выполняется в виде "родного" кода, несмотря на то, что первоначально она была скомпилирована в MSIL-код.
Это значит, что программа будет выполнена практически также быстро, как если бы она с самого начала была скомпилирована с получением"родного" кода, но с "добавлением" преимуществ переносимости от преобразованияв MSIL-код.В результате компиляции Сопрограммы помимо MSIL-кода образуются и метаданные (metadata). Они описывают данные, используемые программой, и позволяюткоду взаимодействовать с другим кодом. Метаданные содержатся в том же файле, гдехранится MSIL-код.I Сравнение управляемого кода с неуправляемымВ общем случае при написании Сопрограммы создается код, называемый управляемым (managed code).
Управляемый код выполняется под управлением CLRсистемы. У такого выполнения в результате есть как определенные ограничения, таки немалые достоинства. К числу ограничений относится необходимость иметь, во28Часть I. Язык С#первых, специальный компилятор, который должен создавать MSIL-файл, предназначенный для работы под управлением CLR-системы, и, во-вторых, этот компилятордолжен использовать библиотеки среды .NET Framework. Достоинства же управляемого кода — современные методы управления памятью, возможность использоватьразличные языки, улучшенная безопасность, поддержка управления версиями и четкая организация взаимодействия программных компонентов.Что же понимается под неуправляемым кодом? Все Windows-программы до создания среды .NET Framework использовали неуправляемый код, который не выполняется CLR-системой.
Управляемый и неуправляемый код могут работать вместе, поэтомуфакт создания С#-компилятором управляемого кода отнюдь не ограничивает его возможность выполняться совместно с ранее созданными программами.Спецификация универсального языкаНесмотря на то что управляемый код обладает достоинствами, предоставляемымиCLR-системой, но если он используется другими программами, написанными наиных языках, то для достижения максимального удобства и простоты использованияон должен соответствовать спецификации универсального языка (Common LanguageSpecification — CLS). Эта спецификация описывает набор свойств, которыми одновременно должны обладать различные языки.
Соответствие CLS-спецификации особенно важно при создании программных компонентов, которые предназначены дляиспользования программами, написанными на других языках. CLS-спецификациявключает подмножество системы поддержки общих типов (Common Type System —CTS). CTS-система определяет правила в отношении типов данных. Безусловно, С#поддерживает как CLS-, так и CTS-спецификации.Глава 1. Создание языка С#29Полныйсправочник поОбзор элементов языка С#амым трудным в изучении языка программирования, безусловно, является то,что ни один его элемент не существует изолированно от других. Компонентыязыка работают вместе, можно сказать, в дружном "коллективе". Такая тесная взаимосвязь усложняет рассмотрение одного аспекта С# без рассмотрения других.
Зачастую обсуждение одного средства предусматривает предварительное знакомство с другим. Для преодоления подобных трудностей в этой главе приводится краткое описание таких элементов С#, как общая форма Сопрограммы, основные инструкцииуправления и операторы. При этом мы не будем углубляться в детали, а сосредоточимся на общих концепциях создания Сопрограммы. Большинство затронутых здесьтем более подробно рассматриваются в остальных главах части I.Объектно-ориентированное программированиеГлавное в языке С# — реализация принципов объектно-ориентированного программирования (ООП).
Объектно-ориентированная методика неотделима от С#, и все С#программы в какой-то степени имеют объектную ориентацию. Поэтому, прежде чемприступать к написанию даже простой Сопрограммы, необходимо понять основныепринципы ООП.ООП — это мощный "рычаг", позволяющий усовершенствовать процесс программирования. С момента изобретения компьютера методы программирования менялисьмного раз и причем коренным образом, но в основном, с целью адаптации к непрерывному повышению сложности программ.
Например, программирование для первыхкомпьютеров осуществлялось посредством набора машинных инструкций (в двоичномкоде) на передней панели компьютера. Этот метод работал до тех пор, пока длинапрограммы не превышала нескольких сот инструкций. С ростом программ был изобретен язык ассемблер, который позволил программисту писать гораздо большие иболее сложные программы, используя символическое представление машинных инструкций. По мере роста программ появились языки высокого уровня (например,FORTRAN и COBOL), которые позволили программистам справляться с возрастающей сложностью программ. Когда эти первые компьютерные языки начали приближаться к критическому состоянию, было изобретено структурное программирование.Каждая веха в развитии программирования характеризовалась созданием методов исредств, позволяющих программисту писать все более сложные программы.
С каждымшагом на этом пути изобретался новый метод, который, опираясь на самые удачныеэлементы предыдущих методов, вносил что-то свое, осуществляя таким образом прогресс в области программирования в целом. Примерно по такой схеме развития инструментария для программистов "дошло дело" и до объектно-ориентированного программирования.
Его появлению способствовал тот факт, что реализация многих проектов начала серьезно стопориться, поскольку структурный подход уже не справлялся споставленными задачами. Нужен был новый способ преодоления сложности программ,и решением этой проблемы стало объектно-ориентированное программирование.Объектно-ориентированное программирование вобрало в себя лучшие идеи структурного программирования и объединило их с новыми концепциями. В результатепоявился более совершенный способ организации программы.
Если говорить в самыхобщих чертах, программу можно организовать одним из двух способов: опираясь либона код (т.е. на действия, или на то, что происходит в программе), либо на данные (т.е.на то, что подвергается определенному воздействию). При использовании исключительно методов структурного программирования программы обычно организовывались с опорой на действия.
Такой подход можно представить себе в виде кода, воздействующего на данные.Глава 2. Обзор элементов языка С#31Объектно-ориентированные программы работают совсем по-другому. Они организованы вокруг данных, а ключевой принцип такой организации гласит: именно данные должны управлять доступом к коду. В объектно-ориентированном языке программист определяет данные и код, который разрешен для выполнения действий надэтими данными. Таким образом, тип данных точно определяет операции, которыемогут быть к ним применены.Для поддержки принципов объектно-ориентированного программирования всеООП-языки, включая С#, имеют три характерных черты: инкапсуляцию, полиморфизм и наследование.ИнкапсуляцияИнкапсуляция — это механизм программирования, который связывает код (действия) и данные, которыми он манипулирует, и при этом предохраняет их от вмешательства извне и неправильного использования.
В объектно-ориентированном языкекод и данные можно связать таким образом, что будет создан автономный черныйящик. Внутри этого ящика находятся все необходимые данные и код. При таком связывании кода и данных создается объект. Другими словами, объект — это элемент,который поддерживает инкапсуляцию.Код, данные или обе эти составляющие объекта могут быть закрытыми внутринего или открытыми. Закрытый код или закрытые данные известны лишь остальнойчасти этого объекта и доступны только ей.
Это означает, что к закрытому коду илиданным не может получить доступ никакая другая часть программы, существующаявне этого объекта. Если код или данные являются открытыми, к ним (несмотря на то,что они определены внутри объекта) могут получить доступ другие части программы.Как правило, открытые части объекта используются для обеспечения управляемогоинтерфейса с закрытыми элементами.Основной единицей инкапсуляции в С# является класс. Класс определяет формуобъекта. Он задает как данные, так и код, который будет оперировать этими данными.В С# класс используется для создания объектов. Объекты — это экземпляры класса.Таким образом, класс — это по сути набор шаблонных элементов, которые показывают, как построить объект.Код и данные, которые составляют класс, называются членами класса.
Данные, определенные в классе, называются переменными экземпляра (instance variable), а код, который оперирует этими данными, — методами-членами (member method), или простометодами. "Метод" — это термин, применяемый в С# для обозначения подпрограммы. Если вы знакомы с языками С или C++, то, вероятно, догадываетесь о том, чтото, что С#-программист называет методом, С/С++-программист назовет функцией. Апоскольку С# — прямой потомок C++, термин "функция" также приемлемо использовать, когда речь идет о С#-методе.ПолиморфизмПолиморфизм (от греческого слова polymorphism, означающего "много форм") — этокачество, которое позволяет одному интерфейсу получать доступ к целому классу действий.