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 (общий базовый класс для всех уведомлений о произошедших событиях), либо на производный класс. Производный класс может содержать дополнительную информацию о событии, например местоположение мыши, клавиша нажатая на клавиатуре.

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

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

C#Делегаты

Делегаты – способ именования сигнатуры метода. Делегаты предназначены для передачи методов другим методам. Если требуется передавать методы в качестве параметров, сведения о методе необходимо поместить в новый тип объекта – делегат. Делегаты содержат информацию о методе.

public delegate void VoidOperation(uint x);

Определили делегат VoidOepration и указали, что каждый экземпляр этого делегата может содержать сведения о методе, принимающем один параметр uint и возвращающем void. Синтаксис аналогичен тому, что используется при определении методов, за исключением того, что отсутствует тело метода, а определение предваряется ключевым словом delegate.

Определив делегата, мы можем создать его экземпляр и использовать его для хранения сведений о конкретном методе.

Пример использования:

int x = 40;
GetString first = new GetString(x.ToString);
Console.WriteLine(first()); // эквивалентен WriteLine(x.ToString());
Читать далее...