Как показывает приведенный выше результат, после присваивания а = b;
переменные структуры а и b по-прежнему остаются совершенно обособленными, т.е. переменная а не указывает на переменную b и никак не связана с ней, помимо того, что она содержит копию значения переменной b. Ситуация была бы совсем иной, если бы переменные а и b были ссылочного типа, указывая на объекты определенного клас са. В качестве примера ниже приведен вариант предыдущей программы, где демон стрируется присваивание переменных ссылки на объекты определенного класса. // Использовать ссылки на объекты определенного класса. using System; // Создать класс. class MyClass { public int x; } // Показать присваивание разных объектов данного класса. class ClassAssignment { static void Main { MyClass a = new MyClass; MyClass b = new MyClass; a.x = 10; b.x = 20; Console.WriteLine("a.x {0}, b.x {1}", a.x, b.x); a = b; b.x = 30; Console.WriteLine("а.х {0}, b.x {1}", a.x, b.x); } }
Выполнение этой программы приводит к следующему результату. а.х 10, b.x 20 а.х 30, b.x 30
Как видите, после того как переменная b будет присвоена переменной а, обе пере менные станут указывать на один и тот же объект, т.е. на тот объект, на который перво начально указывала переменная b.
О назначении структурВ связи с изложенным выше возникает резонный вопрос: зачем в C# включена структура, если она обладает более скромными возможностями, чем класс? Ответ на этот вопрос заключается в повышении эффективности и производительности про грамм. Структуры относятся к типам значений, и поэтому ими можно оперировать непосредственно, а не по ссылке. Следовательно, для работы со структурой вообще не требуется переменная ссылочного типа, а это означает в ряде случаев существенную экономию оперативной памяти. Более того, работа со структурой не приводит к ухуд шению производительности, столь характерному для обращения к объекту класса. Ведь доступ к структуре осуществляется непосредственно, а к объектам — по ссылке, поскольку классы относятся к данным ссылочного типа. Косвенный характер доступа к объектам подразумевает дополнительные издержки вычислительных ресурсов на каждый такой доступ, тогда как обращение к структурам не влечет за собой подобные издержки. И вообще, если нужно просто сохранить группу связанных вместе данных, не требующих наследования и обращения по ссылке, то с точки зрения производи тельности для них лучше выбрать структуру.
Ниже приведен еще один пример, демонстрирующий применение структуры на практике. В этом примере из области электронной коммерции имитируется запись транзакции. Каждая такая транзакция включает в себя заголовок пакета, содержащий номер и длину пакета. После заголовка следует номер счета и сумма транзакции. Заго ловок пакета представляет собой самостоятельную единицу информации, и поэтому он организуется в отдельную структуру, которая затем используется для создания за писи транзакции или же информационного пакета любого другого типа. // Структуры удобны для группирования небольших объемов данных. using System; // Определить структуру пакета. struct PacketHeader { public uint PackNum; // номер пакета public ushort PackLen; // длина пакета } // Использовать структуру PacketHeader для создания записи транзакции // в сфере электронной коммерции. class Transaction { static uint transacNum = 0; PacketHeader ph; // ввести структуру PacketHeader в класс Transaction string accountNum; double amount; public Transaction(string acc, double val) { // создать заголовок пакета ph.PackNum = transacNum++; ph.PackLen = 512; // произвольная длина accountNum = acc; amount = val; } // Сымитировать транзакцию. public void sendTransaction { Console.WriteLine("Пакет #: " + ph.PackNum + ", Длина: " + ph.PackLen + ",\n Счет #: " + accountNum + ", Сумма: {0:C}\n", amount); } } // Продемонстрировать применение структуры в виде пакета транзакции. class PacketDemo { static void Main { Transaction t = new Transaction("31243", -100.12); Transaction t2 = new Transaction("AB4655", 345.25); Transaction t3 = new Transaction("8475-09", 9800.00); t.sendTransaction; t2.sendTransaction; t3.sendTransaction; } }
Вот к какому результату может привести выполнение этого кода. Пакет #: 0, Длина: 512, Счет #: 31243, Сумма: ($100.12) Пакет #: 1, Длина: 512, Счет #: АВ4655, Сумма: $345.25 Пакет #: 2, Длина: 512, Счет #: 8475-09, Сумма: $9,800.00