Поиск

Простые операторы

Первая категория — простые операторы. Поскольку большинство из них элементарны, я их просто перечислю и кратко опишу их функции. Затем я опишу другие, менее понятные.

  • (х) Это разновидность оператора «скобки» для управления порядком вычислений как в математических операциях, так и при вызове методов.
  • х.у Оператор «точка» используется для указания члена класса или структуры. Здесь х представляет сущность, содержащую в себе член у.
  • f(x) Такая разновидность оператора «скобки» применяется для перечисления аргументов методов.
  • а[х] Квадратные скобки используются для индексации массива. Эти скобки также применяются совместно с индексаторами, когда объекты могут рассматриваться как массив.
  • х++ Об операторе инкремента мы поговорим отдельно в разделе «Операторы инкремента и декремента».
  • х— Оператор декремента мы тоже рассмотрим позднее.
  • new Этот оператор используется для создания экземпляров объектов на основании определения класса.
typeof

Отражение (reflection) — это способность получать информацию о типе в период исполнения. Эта информация включает имена типов, классов и элементы структур. В .NET Framework эта функциональность связана с классом System. Type. Этот класс — корень всех операторов отражения и может быть получен с помощью оператора typeof. Сейчас мы не будем вникать в подробности отражения (этим мы займемся в главе 16), но вот простой пример, иллюстрирующий простоту применения оператора typeof 'для получения практически любой информации о типе или объекте во время исполнения программы:

using System;
using System.Reflection;
public class Apple {
public int nSeeds;
public void Ripen()
{
> >
public class TypeOfApp {
public static void Main() {
Type t = typeof(Apple);
string className = t.ToStringO;
Console.ИгШипе("\пИнформация 0 классе {О}", className);
Console.WriteLine("\nMeroflH {0}", className); Console.
WriteLine("————————"); Methodlnfo[] methods = t.GetMethodsO;
foreach (Methodlnfo method in methods)
{
Console.WriteLine(method.ToSt ring());
}
Console.WriteLine("\nBce члены {О}", className); Console.
Writel_ine("————————"); Memberlnfo[] allMembers =
t.GetMembersO; foreach (Memberlnfo member in allMembers)
{
Console. WriteLine(member.ToStringO);
} > }

В этой программе содержится класс Apple, у которого всего два члена: поле nSeeds и метод Ripen. Сначала, используя оператор typeof и имя класса, я получаю объект System. Type, который затем сохраняется в переменной t. С этого момента я могу использовать объект System. Type для получения всех методов и членов класса Apple. Это делается с помощью методов GetMethods и GetMembers соответственно. Результаты выполнения этих методов выводятся на стандартное устройство вывода следующим образом:

Информация о классе Apple Методы Apple
Int32 GetHashCodeQ
Boolean Equals(System.Object)
System.String ToStringQ
Void RipenO
System.Type GetTypeO
Все члены Apple
Int32 nSeeds
Int32 GetHashCodeO
Boolean Equals(System.Object)
System.String ToStringO
Void RipenO
System.Type GetTypeO
Void .ctorO

Прежде чем двигаться дальше, хочу сделать два замечания. Во-первых, обратите внимание, что выводятся и унаследованные члены класса. Так как класс не порожден явно из другого класса, мы знаем, что все члены, не определенные в классе Apple наследуются от неявного базового класса System.Object. Во-вторых, объект System.Type можно получить методом GetType. Этот наследуемый от System.Object метод позволяет работать с объектами, а не с классами. Любой из двух приведенных далее фрагментов можно использовать для получения объекта System. Type.

II Получение объекта System.Type на основе определения класса. Type t1 = typeof(Apple);
// Получение объекта System.Type из объекта. Apple apple = new AppleQ; Type t2 = apple.GetTypeO;
sizeof

Оператор sizeof применяется для получения размера указанного типа в байтах. При этом помните о двух исключительно важных факторах. Во-первых, sizeof можно применять только к размерным типам. Следовательно, хотя его можно использовать для членов классов, для классов как таковых его применять нельзя. Во-вторых, sizeof можно применять только в методах или блоках кода, помеченных как unsafe. С кодом такого рода мы познакомимся в главе 17. Вот пример использования оператора sizeof в методе класса, помеченного как unsafe:

using System;
class BasicTypes {
// Примечание: Код, использующий оператор sizeof, //
должен быть помечен как unsafe, static unsafe public void ShowSizesQ {
Console.WriteLine("\nPa3Mephi основных типов");
Console.WriteLine("Pa3Mep short = {0}", sizeof(short));
Console.WriteLine("Pa3Mep int = {0}", sizeof(int)); Console.Writel_ine("Pa3Mep
long = {0}", sizeof(long)); Console.WriteLine("Pa3Mep bool = {0}",
sizeof(bool)); } }
class UnsafeUpp
{
unsafe public static void MainQ
{
BasicTypes.ShowSizes();
} }

Вот результат выполнения этого приложения:

Размеры основных типов Размер short = 2 Размер int = 4 Размер long = 8 Размер bool = 1

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

// Использование оператора sizeof. using System;
struct StructWithNoMembers
{
}
struct StructWithMembers
{
short s;
int i;
long 1;
bool b; }
struct CompositeStruct
{
StructWithNoMembers a; StructWithMembers b;
StructWithNoMembers c; }
class UnSafe2App {
unsafe public static void Main() {
Console.WriteLine("\nPa3Mep StructWithNoMembers
structure = {0}",
sizeof(StructWithNoMembers));
Console.WriteLine("\nPa3Mep StructWithMembers
structure = {0}",
sizeof(StructWithMembers));
Console.WriteLine("\nPa3Mep CompositeStruct structure = {0}",
sizeof(CompositeStruct)); } }

Хотя можно предположить, что это приложение выведет 0 для структуры без членов (StructWithNoMembers), 15 для структуры с четырьмя членами базовых типов (StructWithMembers) и 15 для структуры, агрегирующей две предыдущие (CompositeStruct), в действительности результат будет таким:

Размер StructWithNoMembers structure = 1 Размер StructWithMembers structure = 16
Размер CompositeStruct structure = 24

Объяснение этому — способ сохранения конструкции struct компилятором в выходном файле, при котором компилятор применяет выравнивание и дополнение пробелами. Например, если структура имеет размер 3 байта и установлено выравнивание по 4-байтным границам, компилятор автоматически добавит в структуру 1 байт, и оператор sizeof укажет, что размер структуры — 4 байта. Не забывайте это учитывать при определении размера структур в С#.

checked и unchecked
Эти два оператора управляют проверкой переполнения при выполнении математических операций.