C#Атрибуты и создание пользовательских атрибутов

По сути дела атрибут – это маркер, которым можно пометить элемент кода, например метод или класс (или даже отдельный аргумент).

[Conditional] (рус. условный) используется для пометки метода как отладочного. Компилятор не будет компилировать этот метод (и любые операторы которые ссылаются на него), если определен следующий символ («DEBUG» например). Объявлен в System.Giagnostics.

[Conditional("DEBUG")] 
public void Generate() {  // отладка }

[DllImport] – помечает метод, как определенный во внешней DLL, а не в какой-либо сборке. Объявлен в пространстве имен System.Runtime.InteropServices.

[DllImport("user32.dll")] 
public static extern int MessageBox(int hParent, string Message, string Caption, int Type); 
...  
MessageBox(0, "Hello", "myProgram", 0);
Читать далее...

C#Работа со строками

Класс string неэффективный для осуществления повторяющихся изменений строки, т.к. после инициализации объекта string он больше не может измениться, а методы и операторы которые изменяют содержимое строки, в действительности создают новые строки, копируя в них содержимое старых строк в случае необходимости.

string Greeting = "Hello "; Greeting += "world!";

Создается объект типа string который инициализируется текстом. При этом среда .NET выделяет ровно столько памяти, сколько необходимо для хранения строки (39) символов, а переменная Greeting будет ссылаться на этот экземпляр строки.

Далее создается новый экземпляр строки, под который выделяется ровно столько памяти, сколько требуется для объединенного текста (в суме 12 символов). Первоначальная строка копируется в новую строку, с добавлением нового текста, после чего обновляется адрес, хранящийся в переменной Greeting (старый строковый объект выходит из области видимости и будет удален сборщиком).

Читать далее...

C#Базовый класс System.Object

Методы базового класса System.Object в C# и их назначение:

ToString() – для быстрого и легкого получения строкового представления объекта.

GetHeshCode() – применяется, если объекты размещаются в отображении (хэш-таблица или словарь). Используется классами, которые работают с такими структурами, для определения того, куда в структуре поместить объект. Если класс должен применяться в качестве ключа для словаря, то для него потребуется перекрыть GetHeshCode().

Finalize() – выполняет роль деструктора, вызывается сборщиком мусора.

GetType() – возвращает экземпляр класса (порожденного от System.Type) который предоставляет обширную информацию о классе, членом которого является объект.

Читать далее...

C#Небезопасный код

Ключевым словом unsafe можно отметить метод, класс (все методы будут не безопасными), поле (указатель), блок кода. Однако локальная переменная не может быть unsafe.

Для компиляции небезопасного кода требуется команда компилятора: csc /unsafe program.cs

Пример небезопасного кода:

Unsafe {int x = 10; int* pX, pY; pX = &x; pY = pX; *pY = 20; }

Невозможно объявить указатель на класс или массив – можно вызвать проблемы со сборщиком мусора. Ключевое слово checked не применимо к указателям.

Читать далее...

C#Обработка событий

Обработчик события обязан выглядеть следующим образом:

public void OnClick(object sender, EventArgs a) {
    // обработка события 
}

Обработчик события не может возвращать ничего кроме void, отсутствуют механизмы возврата значения. Все что можно сделать – вызвать метод. Sender – ссылка на объект, который сгенерировал событие (генератор события передает ссылка на самого себя). Параметр а должен быть ссылкой либо на базовый класс System.EventArgs (общий базовый класс для всех уведомлений о произошедших событиях), либо на производный класс. Производный класс может содержать дополнительную информацию о событии, например местоположение мыши, клавиша нажатая на клавиатуре.

Пример обработки событий:

Читать далее...