Симон Робинсон - C# для профессионалов. Том II
□ Код может требовать, чтобы вызывающая сторона имела специальные полномочия.
□ Выполнение кода ограничено временем выполнения, в этом случае проводятся проверки, которые определяют, соответствуют ли предоставленные полномочия вызывающей стороны требуемым полномочиям операций.
□ Код может запрашивать полномочия, которые ему требуются для выполнения и полномочия, которые будут полезны, а также явно утверждать, какие полномочия он никогда не должен иметь.
□ Определяются полномочия, которые представляют определенные права для доступа к различным системным ресурсам.
□ Администраторы могут выбирать политику системы безопасности, которая присваивает определенные полномочия определенным группам кода.
□ Система безопасности доступа к коду предоставляет полномочия, когда компонент загружается. Это предоставление основывается на запросе кода, а также на операциях, разрешенных системой безопасности.
Обеспечение политики безопасности делает надежной среду управляемого кода .NET. Это объясняется тем, что каждая загружаемая сборка подчиняется политике безопасности, которая предоставляет полномочия для кода на основе доверия, где доверие базируется на признаках данного кода. Система безопасности .NET позволяет коду использовать защищенные ресурсы, только если он имеет на это "полномочие". Код запрашивает полномочия, которые ему требуются, а политика безопасности, применяемая .NET, определяет, какие полномочия будут реально предоставлены коду. Среда .NET предоставляет в C# классы полномочий доступа к коду, каждый из которых инкапсулирует возможность доступа к определенному ресурсу. Связанный с каждым полномочием класс является перечислением флагов полномочий, используемых для определения конкретного флага полномочий доступа к объекту. Эти полномочия используются для указания .NET, что надо разрешить коду делать и что должно быть разрешено вызывающей этот код стороне. Политика использует эти объекты также для определения, какие полномочия дать коду. Далее следует список стандартных полномочий:
□ EnvironmentPermission: определяет полномочия доступа для переменных окружения. Существуют два возможных типа доступа — только для чтения и только для записи. Доступ для записи предоставляет также полномочия для создания и удаления переменных окружения.
□ FileIOPermission: существуют три возможных типа полномочий ввода/вывода для файлов — чтение, запись и добавление. Чтение и запись самоочевидны, добавление ограничивается только добавлением, что читать остальное не разрешается.
□ ReflectionPermission: управляет возможностью чтения информации о типе неоткрытых членов типа, а также использованием Reflection.Emit.
□ RegistryPermission: управляет чтением, записью и созданием в реестре.
□ SecurityPermission: управляет совокупностью флагов полномочий, используемых системой безопасности.
□ UIPermission: управляет доступом к различным аспектам интерфейса пользователя.
□ FileDialogPermission: управляет доступом к файлам на основе диалогового окна системного файла.
□ IsolatedStoragePermission: управляет доступом к изолированной памяти.
В C# существуют два способа изменения текущих полномочий безопасности с помощью использования: вызовов для классов полномочий в средах .NET или атрибутов полномочий безопасности.
Заключение
Microsoft описывает C# как простой, современный, объектно-ориентированный и обеспечивающий безопасность типов язык программирования, производный из С и C++. Так как Java также является модернизацией C++, большая часть синтаксиса и встроенных свойств, представленных в C#, также доступны в Java.
C# использует среду .NET и поэтому предлагает встроенный, обеспечивающий безопасность типов, объектно-ориентированный код, взаимодействующий с любым языком, который поддерживает CTS (общую систему типов). Java может работать с С и C++, но без обеспечения безопасности типов. Более того, это достаточно сложно. В то же время C# предоставляет перезагрузку операторов, a Java этого не делает.
Имена файлов в C# не связаны с классами в них, как это предусмотрено в Java, а также имена пространств имен не связаны с папками, как имена пакетов в Java. C# вводит концепцию делегатов — указателей функций, которые могут использоваться для инкапсуляции метода с определенной сигнатурой. Также C# предлагает множество встроенных типов данных значений, включая обеспечивающие безопасность типов перечисления, структуры и встроенные примитивы, которые представляют достойную альтернативу примитивам Java.
В C# реализовано двунаправленное преобразование между ссылками и типами данных значений, называемое упаковкой и распаковкой. Эта функциональность не поддерживается в Java. C# поддерживает использование классов, укомплектованных полями, конструкторами и методами в качестве шаблонов для описания типов данных, и предоставляет возможность определить деструкторы — методы, вызываемые перед тем, как класс попадает к сборщику мусора. C# предоставляет также три подхода к параметрам методов — in, out или ref, где по умолчанию используется in.
C# вводит также концепцию сокрытия методов, а также поддержку явного переопределения с помощью ключевых слов virtual и override. В C# предусмотрены свойства как альтернатива методам getXXX() и setXXX(), обеспечивающие способ безопасного доступа к внутренним полям. Кроме того, C# допускает создание индексаторов для предоставления индексного доступа к внутренним полям объекта. В отличие от Java, однако, в C# нет возможности объявить, что метод может порождать исключение.
Пространства имен C# предоставляют значительно более гибкий способ группирования связанных классов. В C# возможна эмуляция препроцессора, код условно включается или исключается на основе существования определенных символов. C# предоставляет модель безопасности на основе полномочий, которой можно управлять программным путем.
Приложение C
C# для разработчиков VB6
В этом приложении будет представлено краткое введение в язык C#, специально предназначенное для тех разработчиков, опыт которых до сих пор был частично или полностью связан с Visual Basic 6.
Отметим, что в рамках этого приложения аббревиатура VB означает VB6. В тех случаях, когда говорится о VB.NET, это указывается явно.
C# и Visual Basic являются очень разными языками как в своих синтаксических стилях, так и в фундаментальных концепциях, на которых они основываются. Это означает, что разработчикам Visual Basic потребуются существенные усилия, чтобы освоиться с C# даже на базовом уровне. С помощью этого приложения мы попытаемся облегчить процесс обучения, предоставив введение в C#, которое специально предполагает знание VB, и сосредоточившись на основных концептуальных различиях между двумя языками. В ходе этого приложения будет проведено сравнение, как кодировать решения проблемы в VB и в C#, представляя вместе код C# и код VB.
Это означает, что рассмотрение языка C# ограничится базовым уровнем, здесь не будут рассмотрены более развитые свойства языка, им посвящены учебные главы основного текста книги. Мы сосредоточим внимание на различных методологиях, вовлеченных в написание кода с помощью языка C#.
Различия между C# и VB
Помимо очевидных синтаксических различий между языками, существуют две основные концепции, которые необходимо знать, чтобы можно было двигаться от VB к C#:
1. Концепция полного потока выполнения программы от начала до конца. Visual Basic скрывает этот аспект программ, так что в модулях классов кодируется только часть программы VB, связанная с обработкой событий и всеми методами. C# делает доступной всю программу в виде исходного кода. Это объясняется тем, что C# можно философски рассматривать как последующую генерацию C++, а корни C++ уходят в 60-е годы. C++ предшествовал оконным интерфейсам пользователя и развитым операционным системам. C++ развился как низкоуровневый, близкий к машине универсальный язык программирования. Написать приложение GUI с помощью C++ означает, что необходимо явно вызвать системные вызовы для создания и взаимодействия с оконными формами. Язык C# построили на этом наследии, упростив и модернизировав C++ так, чтобы низкоуровневые преимущества C++ в производительности можно было достичь с помощью кодирования не сложнее, чем в VB. VB, с другой стороны, является молодым языком, созданным специально для быстрой разработки приложений GUI Windows. По этой причине в VB весь стандартный код GUI является скрытым, и программист VB реализует только обработчики событий. C#, со своей стороны, показывает стандартный код как часть исходного кода.
2. Классы и наследование C# значительно более объектно-ориентированны, чем в VB, при условии, что весь код является частью класса. Он обеспечивает также исчерпывающую поддержку наследования реализации. На самом деле большинство хорошо спроектированных программ C# будут в значительной степени отвечать этой форме наследования, которая полностью отсутствует в VB.