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());
Читать далее...

C#Приведение типов

Приведем сразу пример приведения типов в C#:

      public struct Currency
      {     // неявное приведение типа
            public static implicit operator float(Currency value)
            {
                return value.Grn + (value.Kop / 100.0f);
            }
            // явное приведение типа
            public static explicit operator Currency(float value)
            {
                checked {
                    uint Grn = (uint)value;
                    ushort Kop = (ushort)((value - Grn) * 100);
                    return new Currency(Grn, Kop); }
            }
        } ... 
      // неявное преобразование
      Currency balance = new Currency(10,50);  // 10 грн. 50 коп.
      float D = balance; // нужно чтобы D было присвоено 10.50
      // явное преобразование
      float money = 45.63f;
      Currency myMoney = (Currency)money;

Нельзя осуществлять приведение типов между классами, один из которых явно или неявно является производным от другого. Приведение типа может быть объявлено внутри любого типа-источника, либо типа-приемника.

Всегда можно неявно привести производный класс к базовому, а базовый явно к производному. Ссылка на базовый тип может ссылаться как на объекты базового класса, так и на объекты производные от него.

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

C#ООП и работа с классами

Поля, объявленные с ключевым словом static, называются статическими полями, в то время как поля без static именуют полями экземпляра или данными экземпляра. Поле экземпляра можно считать принадлежащим объекту, а статическое поле – принадлежащим классу.

Поле, объявленное как static существует пока программа выполняется, начиная с того момента, как был загружен соответствующий модуль или сборка, содержащая определение класса. Это происходит когда код пытается использовать что-либо из сборки, поэтому можно гарантировать, что статическая переменная всегда будет существовать. Это не зависит от того, были ли объявлены какие-нибудь переменные данного класса. В некотором смысле статические поля выполняют те же функции, что и глобальные переменные.

Ключевое слово static не зависит от модификатора доступа (на практике вроде бы иначе!).

Следует всегда вызывать статические методы, используя имя класса, а методы экземпляра, указывая имя экземпляра класса. Методы экземпляра, так же как и статические методы, хранятся в памяти только в оном месте и связаны с классом в целом.

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

C#Передача аргументов

Аргументы могут быть переданы по значению и по ссылке.

Следует отметить, что строки является неизменными (при изменении строки создается совершенно новая строка), поэтому они не ведут себя как тип по ссылке. Любые изменения строки, сделанные по ссылке не затронут ее оригинал.

Для передачи значения переменной по ссылке используется ключевое слово ref. Если в метод передается параметр, а аргумент метода помечен как ref, то любое изменение переменной, сделанное методом, вызовет соответствующие изменения оригинальной переменной.

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

C#Преобразование типов и модификаторы переменных

При преобразовании типов, необходимо следить за диапазоном значений.

В C# есть оператор cheked() который можно использовать для проверки того, что операция не вызывает переполнения стека. С помощью этого оператора можно выяснить безопасно ли приведение типов, и заставить среду сгенерировать исключение переполнения если это не так:

Метод Parse() «грамматический разбор» поддерживают все предопределенные типы по значению, используется для конвертации в другие типы.

Упаковка (boxing) и распаковка позволяют преобразовывать типы по значению и типы по ссылке и наоборот.

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