.NET Framework
Расширенные возможности .NET и C#
Лектор: Андрей Михайлович Степанов
1
Пространства имён
Пространство имён – часть имени класса перед последним словом (части отделяются точкой). Используется для организации иерархии, устранения конфликтов в названиях.
namespace Goofy { namespace Utils {
public class String {
…
}
}
}
…
System.String s1; Goofy.Utils.String s2;
В CIL полное имя класс всегда идёт с сборкой:
IL_0001: newobj instance void [MyLibrary.Utils]Goofy.Utils.String::.ctor()
2
Делегаты
Делегат – безопасный аналог указателя на функцию; вызов делегата приводит к вызову всех функций, перечисленных в нём.
delegate int MyDelegate ( int b ); private static int Func1 ( int x )
{ return x * 2; }
private static int Func2 ( int x ) { return x * 3; }
…
MyDelegate del1 = Func1;
MyDelegate del2 = (MyDelegate)Func1 + (MyDelegate)Func2; int r = del1 ( 5 );
int g = del2 ( 5 );
3
События
Событие – стандартизованная пара функций для чтения/записи делегата.
delegate void EventHandler ( object sender, EventArgs e ); // Делегат
event EventHandler Click; // Объявление
ok.Click += OkClicked; // Подпись на событие
if ( Click!= null )
Click( this, null ); // Вызов события в кнопке
4
Интерфейсы
Интерфейс определяет «контракт» (набор методов, свойств, событий) без их реализации.
interface IDraggable {
void MoveTo ( int x, int y );
}
…
if ( o is IDraggable ) {
(o as IDraggable).MoveTo ( x, y ); ((IDraggable)o).MoveTo ( x, y );
}
5
Сборки
Сборка – хранилище IL-кода и символьной информации (метаданных). Это позволяет подключать сборку к программе без дополнительных файлов с описанием типов. Обычно сборка в Windows – один файл .dll или .exe.
Данные сборки: манифест (используемые сборки, атрибуты, версия, цифровая подпись, системные флаги и настройки), метаданные типов, IL-код.
6
Пример манифеста сборки
.assembly extern mscorlib { |
|
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) |
// .z\V.4.. |
.ver 4:0:0:0 |
|
} |
|
.assembly extern System { |
|
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) |
// .z\V.4.. |
.ver 4:0:0:0 |
|
} |
|
.assembly extern System.Windows.Forms { |
|
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) |
// .z\V.4.. |
.ver 4:0:0:0 |
|
} |
|
.assembly ConsoleApplication2 { |
|
.custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = ( 01 00 13 43 6F 6E 73 6F 6C 65 41 70 70 6C 69 63 } // ...ConsoleApplic
…..
.hash algorithm 0x00008004
.ver 1:0:0:0
}
.module ConsoleApplication2.exe
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 |
// WINDOWS_CUI |
.corflags 0x00000003 |
// ILONLY 32BITREQUIRED |
7
Отражение (рефлексия)
Отражение – механизм получения информации о типах и создании типов во время исполнения. Позволяет: загрузить сборку динамически, найти все типы в ней, создать нужный тип, запросить атрибуты и т.д.
Type tp = obj.GetType ( );
object res = tp.InvokeMember ( “SomeMethod”, BindingFlags.Public | BindingFlags.Instance, null, obj );
8
Атрибуты
Атрибут – пользовательский модификатор типа, члена типа (метода, свойства…), сборки. Не влияет напрямую на поведение кода, но может быть прочитан во время выполнения программы.
class Employee {
public int ID { get; set; }
[Required] // ==RequiredAttribute public string Name { get; set; }
}
9
Исключения
Исключение – прерывание выполнения программы с распространением его вверх по стеку вызова вплоть до нахождения обработчика прерывания или завершения программы.
try {
long.Parse ( "a" );
}
catch ( Exception e ) { throw e;
throw; }
10