Читать в оригинале

<< ПредыдущаяОглавлениеСледующая >>


4.3.2. Операции sizeof и typeof

Операция sizeof возвращает размер значимых типов, заданный в байтах. Пояснения требуют некоторые особенности ее применения. Она должна выполняться только в небезопасных блоках. Поэтому проект, в котором она может использоваться, должен быть скомпилирован с включенным свойством /unsafe. На рис. 17 показано, как на странице свойств проекта можно включить это свойство.

Далее необходимо создать небезопасный блок, например, метод класса, помеченный как unsafe, в котором уже можно вызывать эту функцию (операцию). Приведем пример такого метода, созданного в классе Testing.

/// <summary>
/// определение размеров и типов
/// </summary>
unsafe public static void SizeMethod() {
          Console.WriteLine("Размер типа Boolean = " + sizeof(bool));
          Console.WriteLine("Размер типа double = " + sizeof(double));
          Console.WriteLine("Размер типа char = " + sizeof(System.Char));
          int b1 = 1;
          Type t = b1.GetType();
          Console.WriteLine("Тип переменной b1: {0}", t);
          //Console.WriteLine("Размер переменной b1: {0}", sizeof(t));
}//SizeMethod

Рисунок 17. Включение свойства /unsafe

В этом примере операция применяется к трем встроенным типам - bool, double, char. Консольный вывод дает в качестве результата значения: 1, 8 и 2. Следует отметить, что аргументом операции может быть только имя типа. Попытка применить эту операцию к переменной t типа Type, имеющей значение System.Int32, приводит к ошибке компиляции.

Операция typeof, примененная к своему аргументу, возвращает его тип. В роли аргумента может выступать имя класса, как встроенного, так и созданного пользователем. Возвращаемый операцией результат имеет тип Type. К экземпляру класса применять операцию нельзя, но зато для экземпляра можно вызвать метод GetType, наследуемый всеми классами, и получить тот же результат, что дает typeof с именем данного класса. Такой альтернативный способ получения типа по экземпляру класса int показан в приведенном выше программном фрагменте. В качестве примера использования вызова операции typeof добавим в метод sizeMetod следующие строки:

t = typeof(Class1);
Console.WriteLine(“Тип класса Class1: {0}", t);
t = typeof(Testing);
Console.WriteLine(“Тип класса Testing: {0}", t);

Зная информаицю о типе класса, можно получить подробную информацию обо всех методах и полях класса. Ясно, что такая информация может быть весьма полезной, если класс поставлен сторонней фирмой. Для этого используется процесс получения метаданных, называемый отражением (reflection). Рефлексия является очень мощным механизмом, позволяющим даже создавать программный код MSIL в процессе работы приложения. Обсуждение рефлексии выходит за рамки данного учебного пособия.

 



<< ПредыдущаяОглавлениеСледующая >>