Book bоокЗ; // конструктор не вызывается



 

Console.WriteLine(bookl.Author + ", " +

bookl.Title + ", (c) " + bookl.Copyright);

Console.WriteLine();

 

if (book2.Title == null)

Console.WriteLine("Член book2.Title пуст.");

 

А теперь ввести информацию в структуру book2.

book2.Title = "О дивный новый мир";

book2.Author = "Олдос Хаксли";

book2.Copyright = 1932;

 

Console.Write("Структура book2 теперь содержит:\n");

Console.WriteLine(book2.Author + ", " +

book2.Title + ", (c) " + book2.Copyright);

Console.WriteLine() ;

 

Console.WriteLine(bоокЗ.Title); // неверно, этот член структуры

Нужно сначала инициализировать

 

bоокЗ.Title = "Красный шторм";

Console.WriteLine(bоокЗ.Title); // теперь верно

}

}

 

При выполнении этой программы получается следующий результат.

 

Герберт Шилдт, Полный справочник по C# 4.0, (с) 2010

 

Член book2.Title пуст.

Структура bоок2 теперь содержит:

Олдос Хаксли, О дивный новый мир, (с) 1932

 

Красный шторм

 

Как демонстрирует приведенный выше пример программы, структура может быть инициализирована с помощью оператора new для вызова конструктора или же путем простого объявления объекта. Так, если используется оператор new, то поля структуры инициализируются конструктором, вызываемым по умолчанию (в этом случае во всех полях устанавливается задаваемое по умолчанию значение), или же конструктором, определяемым пользователем. А если оператор new не используется, как это имеет место для структуры bоокЗ, то объект структуры не инициализируется, а его поля должны быть установлены вручную перед тем, как пользоваться данным объектом.

Когда одна структура присваивается другой, создается копия ее объекта. В этом заключается одно из главных отличий структуры от класса. Как пояснялось ранее в этой книге, когда ссылка на один класс присваивается ссылке на другой класс, в итоге ссылка в левой части оператора присваивания указывает на тот же самый объект, что и ссылка в правой его части. А когда переменная одной структуры присваивается переменной другой структуры, создается копия объекта структуры из правой части оператора присваивания. Рассмотрим в качестве примера следующую программу.

 

// Скопировать структуру.

using System;

// Определить структуру,

struct MyStruct {

public int x;

}

 

// Продемонстрировать присваивание структуры,

class StructAssignment {

static void Main() {

MyStruct a;

MyStruct b;

 

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("a.x {0}, b.x {1}", a.x, b.x);

}

}

 

Вот к какому результату приводит выполнение этой программы.

 

А.х 10, b.x 20 а.х 20, b.x 30

 

Как показывает приведенный выше результат, после присваивания

 

а = 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.х 20 а.х 30, b.х 30

 

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

 

 

О назначении структур

 

В связи с изложенным выше возникает резонный вопрос: зачем в C# включена структура, если она обладает более скромными возможностями, чем класс? Ответ на этот вопрос заключается в повышении эффективности и производительности программ. Структуры относятся к типам значений, и поэтому ими можно оперировать непосредственно, а не по ссылке. Следовательно, для работы со структурой вообще не требуется переменная ссылочного типа, а это означает в ряде случаев существенную экономию оперативной памяти. Более того, работа со структурой не приводит к ухудшению производительности, столь характерному для обращения к объекту класса. Ведь доступ к структуре осуществляется непосредственно, а к объектам — по ссылке, поскольку классы относятся к данным ссылочного типа. Косвенный характер доступа к объектам подразумевает дополнительные издержки вычислительных ресурсов на каждый такой доступ, тогда как обращение к структурам не влечет за собой подобные издержки. И вообще, если нужно просто сохранить группу связанных вместе данных, не требующих наследования и обращения по ссылке, то с точки зрения производительности для них лучше выбрать структуру.

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

 

// Структуры удобны для группирования

// небольших объемов данных,

using System;

// Определить структуру пакета,

struct PacketHeader {


Дата добавления: 2019-02-12; просмотров: 233; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!