Полное руководство. С# 4.0 - Шилдт Герберт
Помимо псевдокода MSIL, при компилировании программы на С# получаютсятакже метаданные, которые служат для описания данных, используемых в программе,а также обеспечивают простое взаимодействие одного кода с другим. Метаданные содержатся в том же файле, что и псевдокод MSIL.Управляемый и неуправляемый код
Как правило, при написании программы на C# формируется так называемыйуправляемый код. Как пояснялось выше, такой код выполняется под управлением средыCLR, и поэтому на него накладываются определенные ограничения, хотя это и дает рядпреимуществ. Ограничения накладываются и удовлетворятся довольно просто: компилятор должен сформировать файл MSIL, предназначенный для выполнения в средеCLR, используя при этом библиотеку классов .NET, — и то и другое обеспечиваетсясредствами С#. Ко многим преимуществам управляемого кода относятся, в частности,современные способы управления памятью, возможность программирования на разных языках, повышение безопасности, поддержка управления версиями и четкая организация взаимодействия программных компонентов.
В отличие от управляемого кода, неуправляемый код не выполняется в среде CLR.Следовательно, до появления среды .NET Framework во всех программах для Windowsприменялся неуправляемый код. Впрочем, управляемый и неуправляемый коды могут взаимодействовать друг с другом, а значит, формирование управляемого кода в С#совсем не означает, что на его возможность взаимодействия с уже существующимипрограммами накладываются какие-то ограничения.Общеязыковая спецификация
Несмотря на все преимущества, которые среда CLR дает управляемому коду,для максимального удобства его использования вместе с программами, написанными на других языках, он должен подчинятся общеязыковой спецификации (CommonLanguage Specification — CLS), которая определяет ряд общих свойств для разных.NET-совместимых языков. Соответствие CLS особенно важно при создании программных компонентов, предназначенных для применения в других языках. В CLS в качествеподмножества входит общая система типов (Common Type System — CTS), в которойопределяются правила, касающиеся типов данных. И разумеется, в C# поддерживаетсякак CLS, так и CTS.
ГЛАВА 2. Краткий обзор элементов C
Наибольшие трудности в изучении языка программирования вызывает то обстоятельство, что ниодин из его элементов не существует обособленно.Напротив, все элементы языка действуют совместно. Такаявзаимосвязанность затрудняет рассмотрение одного аспекта C# безотносительно к другому. Поэтому для преодоления данного затруднения в этой главе дается краткий обзорнескольких средств языка С#, включая общую форму программы на С#, ряд основных управляющих и прочих операторов. Вместо того чтобы углубляться в детали, в этой главеосновное внимание уделяется лишь самым общим принципам написания любой программы на С#. А большинствовопросов, затрагиваемых по ходу изложения материалаэтой главы, более подробно рассматриваются в остальныхглавах части I.Объектно-ориентированное программирование
Основным понятием C# является объектно-ориентированное программирование (ООП). Методика ООП неотделима от С#, и поэтому все программы на C# являютсяобъектно-ориентированными хотя бы в самой малой степени. В связи с этим очень важно и полезно усвоить основополагающие принципы ООП, прежде чем приступатьк написанию самой простой программы на С#.
ООП представляет собой эффективный подход к программированию. Методики программирования претерпели существенные изменения с момента изобретениякомпьютера, постепенно приспосабливаясь, главным образом, к повышению сложности программ. Когда, например, появились первые ЭВМ, программирование заключалось в ручном переключении на разные двоичные машинные команды с переднегопульта управления ЭВМ. Такой подход был вполне оправданным, поскольку программы состояли всего из нескольких сотен команд. Дальнейшее усложнение программпривело к разработке языка ассемблера, который давал программистам возможностьработать с более сложными программами, используя символическое представлениеотдельных машинных команд. Постоянное усложнение программ вызвало потребность в разработке и внедрении в практику программирования таких языков высокогоуровня, как, например, FORTRAN и COBOL, которые предоставляли программистамбольше средств для того, чтобы как-то справиться с постоянно растущей сложностьюпрограмм. Но как только возможности этих первых языков программирования былиполностью исчерпаны, появились разработки языков структурного программирования, в том числе и С.
На каждом этапе развития программирования появлялись методы и инструментальные средства для "обуздания" растущей сложности программ. И на каждомтаком этапе новый подход вбирал в себя все самое лучшее из предыдущих, знаменуя собой прогресс в программировании. Это же можно сказать и об ООП. До ООПмногие проекты достигали (а иногда и превышали) предел, за которым структурныйподход к программированию оказывался уже неработоспособным. Поэтому для преодоления трудностей, связанных с усложнением программ, и возникла потребностьв ООП.
ООП вобрало в себя все самые лучшие идеи структурного программирования,объединив их с рядом новых понятий. В итоге появился новый и лучший способ организации программ. В самом общем виде программа может быть организована однимиз двух способов: вокруг кода (т.е. того, что фактически происходит) или же вокругданных (т.е. того, что подвергается воздействию). Программы, созданные только методами структурного программирования, как правило, организованы вокруг кода. Такойподход можно рассматривать "как код, воздействующий на данные".
Совсем иначе работают объектно-ориентированные программы. Они организованывокруг данных, исходя из главного принципа: "данные управляют доступом к коду".В объектно-ориентированном языке программирования определяются данные и код,которому разрешается воздействовать на эти данные. Следовательно, тип данных точно определяет операции, которые могут быть выполнены над данными.
Для поддержки принципов ООП все объектно-ориентированные языки программирования, в том числе и С#, должны обладать тремя общими свойствами: инкапсуляцией, полиморфизмом и наследованием. Рассмотрим каждое из этих свойств в отдельности.Инкапсуляция
Инкапсуляция — это механизм программирования, объединяющий вместе коди данные, которыми он манипулирует, исключая как вмешательство извне, так и неправильное использование данных. В объектно-ориентированном языке данные и кодмогут быть объединены в совершенно автономный черный ящик. Внутри такого ящиканаходятся все необходимые данные и код. Когда код и данные связываются вместе подобным образом, создается объект. Иными словами, объект — это элемент, поддерживающий инкапсуляцию.
В объекте код, данные или же и то и другое могут быть закрытыми или же открытыми. Закрытые данные или код известны и доступны только остальной частиобъекта. Это означает, что закрытые данные или код недоступны части программы,находящейся за пределами объекта. Если же данные или код оказываются открытыми,то они доступны другим частям программы, хотя и определены внутри объекта. Какправило, открытые части объекта служат для организации управляемого интерфейсас закрытыми частями.
Основной единицей инкапсуляции в C# является класс, который определяет формуобъекта. Он описывает данные, а также код, который будет ими оперировать. В C#описание класса служит для построения объектов, которые являются экземплярамикласса. Следовательно, класс, по существу, представляет собой ряд схематических описаний способа построения объекта.
Код и данные, составляющие вместе класс, называют членами. Данные, определяемые классом, называют полями, или переменными экземпляра. А код, оперирующийданными, содержится в функциях-членах, самым типичным представителем которыхявляется метод. В C# метод служит в качестве аналога подпрограммы. (К числу другихфункций-членов относятся свойства, события и конструкторы.) Таким образом, методыкласса содержат код, воздействующий на поля, определяемые этим классом.Полиморфизм