- •Ilasm. Применение утилит ildasm и Reflector. Внутреннее устройство сборок Microsoft .Net.
- •Использование атрибутов
- •Библиотека классов Microsoft .Net Framework. Примеры использования библиотеки классов.
- •Библиотека классов .Net Framework
- •Директивы using и ссылки
- •Библиотеки классов ввода/вывода пространства имен System.Io. Примеры использования.
- •Применение экспортированных функций dll
- •Оператор for
- •В отличие от оператора for оператор while никак не изменяет значения пере-
- •Делегаты и события на платформе Microsoft .Net.
- •Компонентное программирование в .Net
- •13(2). Компонентное программирование в .Net (1)
- •Концепция применения программных платформ. Преимущества применения программных платформ при разработке приложений (на примере Microsoft .Net)
- •Visual Studio .Net набор языков платформы Microsoft .Net послужит отличным под-
- •Компилятор jit
- •Объектно-ориентированный подход к программированию. Классы и объекты. Определения; Определения классов и объектов. Проблемы, решаемые этим подходом.
- •Плюсы ооп:
- •Оператор switch
- •Возврат goto
- •Основные операторы языка c#
- •Работа с файлами в языке с#. Синтаксис, алгоритм работы при чтении/записи в файл.
- •Синхронизация потоков (interlocked-функции и критические секции). Основные проблемы синхронизации.
- •Строгая и нестрогая типизация, характеристики типов данных. Определение типа данных.
- •Разработка Windows-приложений с использованием технологии Windows Forms. Основные идеи технологии. Примеры эффективного применения.
- •Ide Visual c# автоматически создает код инициализации. В представлении Код найдите конструктор для класса Form1. У него есть подпись public Form1().
-
Строгая и нестрогая типизация, характеристики типов данных. Определение типа данных.
Для начала рассмотрим основные различия между сильной и слабой типизацией. Прежде всего, слабая (нестрогая)типизация предполагает неявное вычисление/преобразование типов и/или adhocполиморфизм.Таким образом, тип переменной вычисляется на момент выполнения присвоения ей некого значения.
Специальный (или лат. adhoc) полиморфизм допускает специальную реализацию для данных каждого типа. Например, используемая в нашем примере функцией сортировки функция сравнения должна быть определена по-разному для чисел, кортежей, списков, т. е. она является специально полиморфной.
При сильной(строгой) типизации все типы известны заранее, и преобразование проходит по заранее установленным строгим правилам. Строгим, понятно, по отношению к правилам принятым при слабой типизации.
Сильную (строгую) типизацию, представляет язык C#. Если раньше в C++ мы могли написать:
MyObj* m_pObj = GenerateMyObj();
if(!m_pObj)
return -1;
То уже в C# такое преобразование типов не пройдёт, тут будь добр делать все явно:
MyObjm_pObj = GenerateMyObj();
if(m_pObj == null)
return -1;
В этой разновидности типизации для присвоения переменной некоторого значения мы должны сначала объявить эту переменную и задать ей тип. Т.е. основное отличие от слабой типизации в том, что на момент компиляции все типы должны быть известны. Так же, не может быть речи не о каком adhoc полиморфизме. Например, в случае функционального полиморфизма операция сложения, определённая для целочисленных типов, при использовании со строками просто вызовет ошибку компиляции.
У строгой типизации есть одно неоспоримое преимущество, такой код надёжнее. Однако и вслабой есть свои плюсы, язык с такой системой типов более гибкий. В компилируемых языках (С, С++) строгая типизация оказывается удобнее.
Тип данных - характеристика набора данных, которая определяет:
- диапазон возможных значений данных из набора;
- допустимые операции, которые можно выполнять над этими значениями;
- способ хранения этих значений в памяти.
Различают:
- простые типы данных: целые, действительные числа и др.;
- составные типы данных: массивы, файлы и др.
-
Структуры данных на платформе Microsoft .NET (массивы, списки, коллекции, хеш-таблицы), их свойства, примеры использования.
Массив — это структура данных, содержащая несколько переменных одного типа. Массивы объявляются со следующим типом.
type[] arrayName;
Массив имеет следующие свойства.
-
Массив может быть одномерным, многомерным или массивом массивов.
-
Значение по умолчанию числовых элементов массива задано равным нулю, а элементы ссылок имеют значение NULL.
-
Невыровненный массив является массивом массивов и поэтому его элементы являются ссылочными типами и инициализируются значением null.
-
Индексация массивов начинается с нуля: массив с элементами n индексируется от 0 до n-1.
-
Элементы массива могут быть любых типов, включая тип массива.
-
Типы массива являются ссылочными типами, производными от абстрактного базового типа Array. Поскольку этот тип реализует IEnumerable иIEnumerableHYPERLINK "http://msdn.microsoft.com/ru-ru/library/9eekhta0(v=VS.90).aspx"<HYPERLINK "http://msdn.microsoft.com/ru-ru/library/9eekhta0(v=VS.90).aspx"THYPERLINK "http://msdn.microsoft.com/ru-ru/library/9eekhta0(v=VS.90).aspx">, в C# во всех массивах можно использовать итерацию foreach.
int[][] jaggedArray3 =
{
new int[] {1,3,5,7,9},
new int[] {0,2,4,6},
new int[] {11,22}
};
Библиотека классов .NET Framework предоставляет ряд универсальных классов коллекций в пространствах имен System.Collections.Generic иSystem.Collections.ObjectModel.Дополнительные сведения об этих классах содержатся в разделе Часто используемые типы коллекций.
System.Collections.Generic
Большинство типов универсальных коллекций являются прямыми аналогами неуниверсальных типов.DictionaryHYPERLINK "http://msdn.microsoft.com/ru-ru/library/xfhwa508.aspx"<HYPERLINK "http://msdn.microsoft.com/ru-ru/library/xfhwa508.aspx"TKey, TValueHYPERLINK "http://msdn.microsoft.com/ru-ru/library/xfhwa508.aspx"> является универсальной версией Hashtable. Для перечисления он использует универсальную структуру KeyValuePairHYPERLINK "http://msdn.microsoft.com/ru-ru/library/5tbh8a42.aspx"<HYPERLINK "http://msdn.microsoft.com/ru-ru/library/5tbh8a42.aspx"TKey, TValueHYPERLINK "http://msdn.microsoft.com/ru-ru/library/5tbh8a42.aspx"> вместо DictionaryEntry.
ListHYPERLINK "http://msdn.microsoft.com/ru-ru/library/6sh2ey19.aspx"<HYPERLINK "http://msdn.microsoft.com/ru-ru/library/6sh2ey19.aspx"THYPERLINK "http://msdn.microsoft.com/ru-ru/library/6sh2ey19.aspx"> является универсальной версией ArrayList.Существуют и универсальные классы QueueHYPERLINK "http://msdn.microsoft.com/ru-ru/library/7977ey2c.aspx"<HYPERLINK "http://msdn.microsoft.com/ru-ru/library/7977ey2c.aspx"THYPERLINK "http://msdn.microsoft.com/ru-ru/library/7977ey2c.aspx"> и StackHYPERLINK "http://msdn.microsoft.com/ru-ru/library/3278tedw.aspx"<HYPERLINK "http://msdn.microsoft.com/ru-ru/library/3278tedw.aspx"THYPERLINK "http://msdn.microsoft.com/ru-ru/library/3278tedw.aspx">, которые соответствуют неуниверсальным версиям.
Существуют универсальные и неуниверсальные версии SortedListHYPERLINK "http://msdn.microsoft.com/ru-ru/library/ms132319.aspx"<HYPERLINK "http://msdn.microsoft.com/ru-ru/library/ms132319.aspx"TKey, TValueHYPERLINK "http://msdn.microsoft.com/ru-ru/library/ms132319.aspx">.Обе эти версии являются гибридами словаря и списка.Универсальный классSortedDictionaryHYPERLINK "http://msdn.microsoft.com/ru-ru/library/f7fta44c.aspx"<HYPERLINK "http://msdn.microsoft.com/ru-ru/library/f7fta44c.aspx"TKey, TValueHYPERLINK "http://msdn.microsoft.com/ru-ru/library/f7fta44c.aspx"> представляет собой обычный словарь и не имеет неуниверсального эквивалента.
Универсальный класс LinkedListHYPERLINK "http://msdn.microsoft.com/ru-ru/library/he2s3bh7.aspx"<HYPERLINK "http://msdn.microsoft.com/ru-ru/library/he2s3bh7.aspx"THYPERLINK "http://msdn.microsoft.com/ru-ru/library/he2s3bh7.aspx"> является точным связанным списком.Он не имеет неуниверсального эквивалента.
ICollection Определяет размер, перечислители и методы синхронизации для всех нестандартных коллекций.
IComparer Предоставляет метод для сравнения двух объектов.
IDictionary Представляет небазовую коллекцию пар "ключ-значение".
IDictionaryEnumerator Перечисляет элементы неуниверсального словаря.
IEnumerable Предоставляет перечислитель, который поддерживает простой перебор элементов неуниверсальной коллекции.
IEnumerator Поддерживает простой перебор по неуниверсальной коллекции.
IEqualityComparer Определяет методы для поддержки операций сравнения объектов в отношении равенства.
IHashCodeProvider Устаревшее. Предоставляет хеш-код объекта, используя пользовательскую хеш-функцию.
IList Представляет неуниверсальную коллекцию объектов с индивидуальным доступом, осуществляемым при помощи индекса.
ArrayList Реализует интерфейс IList с помощью массива с динамическим увеличением размера до нужного значения.
BitArray Управляет компактным битовым массивом значений, представленных логическими значениями, где значение true соответствует 1, а значение false соответствует 0.
CaseInsensitiveComparer Проверяет равенство двух объектов без учета регистра строк.
CaseInsensitiveHashCodeProvider Устаревшее. Предоставляет хэш-код объекта, используя алгоритм хэширования, при котором не учитывается регистр строк.
CollectionBase Предоставляет базовый класс abstract для строго типизированной коллекции.
Comparer Проверяет равенство двух объектов с учетом регистра строк.
DictionaryBase Предоставляет базовый классabstract для строго типизированной коллекции ключ/значение.
Hashtable Предоставляет коллекцию пар "ключ-значение", которые упорядочены по хэш-коду ключа.
Queue Предоставляет коллекцию объектов, которая обслуживается по принципу "первым поступил — первым обслужен".
ReadOnlyCollectionBase Предоставляет базовый класс abstract для неуниверсальной коллекции со строгим типом, которая доступна только для чтения.
SortedList Предоставляет коллекцию пар "ключ-значение", упорядоченных по ключам. Доступ к парам можно получить по ключу и по индексу.
Stack
Списки
Реализует интерфейс IList с помощью массива с динамическим увеличением размера до нужного значения.
ArrayList myAL = new ArrayList();
myAL.Add("Hello");
Хэш-таблицы Hashtable
Предоставляет коллекцию пар "ключ-значение", которые упорядочены по хэш-коду ключа.
Каждый элемент в паре "ключ-значение" хранится в объекте DictionaryEntry. Ключ не может быть равным null, а значение — может.
Объекты, используемые коллекцией Hashtable в качестве ключей, требуются для переопределения метода Object.GetHashCode (или интерфейсаIHashCodeProvider ) и метода Object.Equals (или интерфейса IComparer ). Реализация обоих методов и интерфейсов должна одинаковым образом учитывать регистр; в противном случае действие коллекции Hashtable может быть неправильным. Например, когда создается объект Hashtable, следует использовать класс CaseInsensitiveHashCodeProvider (или любую нечувствительную к регистру реализацию интерфейса IHashCodeProvider) с классомCaseInsensitiveComparer (или любой нечувствительной к регистру реализацией интерфейса IComparer).
Более того, при вызове этих методов с одними и теми же параметрами результат должен быть одинаковым, если ключ существует в коллекции Hashtable. В качестве альтернативы можно использовать конструктор класса Hashtable с параметром IEqualityComparer. Если равенство ключей определяется просто через равенство ссылок, будет достаточно наследуемой реализации методов Object.GetHashCode и Object.Equals.
Объекты, используемые в качестве ключей в коллекции Hashtable, должны быть доступны только для чтения.
При добавлении элемента в коллекцию Hashtable он помещается в определенный сегмент в зависимости от хэш-кода ключа. В дальнейшем поиск ключа осуществляется только в определенном сегменте с использованием хэш-кода ключа. Таким образом в значительной степени уменьшается количество операций сравнения ключей, которое требуется для нахождения элемента.
Показатель загрузки коллекции Hashtable определяет максимальное отношение количества элементов к количеству сегментов. Снижение показателя загрузки уменьшает среднее время поиска за счет увеличения объема используемой памяти. Значение показателя загрузки по умолчанию, равное 1,0, обычно обеспечивает наилучшее соотношение между объемом памяти и временем поиска. При создании коллекции Hashtable может быть задан другой показатель загрузки.
Когда элементы добавляются в коллекцию Hashtable, фактический показатель загрузки коллекции Hashtable увеличивается. Когда фактический показатель загрузки становится равным заданному, количество сегментов в объекте Hashtable автоматически увеличивается до наименьшего простого числа, которое больше удвоенного текущего количества сегментов в коллекции Hashtable.
Каждый ключевой объект в коллекции Hashtable должен иметь свою собственную хэш-функцию, доступ к которой может быть получен при вызове методаGetHash. Однако каждый объект, реализующий интерфейс IHashCodeProvider, может быть передан в конструктор класса Hashtable, а соответствующая хэш-функция используется для всех объектов в таблице.
Емкость коллекции Hashtable — это количество элементов, которое может вместить коллекция Hashtable. Когда в коллекцию Hashtable добавляются элементы, ее емкость автоматически увеличивается должным образом посредством перераспределения.
vb#c#
В операторе foreach языка C# (for each в Visual Basic) необходима информация о типе каждого элемента коллекции. Так как каждый элемент коллекцииHashtable представляет собой пару "ключ-значение", тип элемента не является типом ключа или типом значения. Вместо этого в качестве типа элемента используется DictionaryEntry. Например:
Hashtable openWith = new Hashtable();
openWith.Add("txt", "notepad.exe");
foreach( DictionaryEntry de in openWith )
{
Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value);
}