Занятие №60
Назначение и синтаксис структуры. Элементы тела структуры. Сходства и различия структур и классов.
Наряду с классами структуры представляют еще один способ создания собственных типов данных в C#.
Объявляется структура со словом struct Структура и класс очень похожи по функциональности. Структура как и класс содержит конструкторы, переменные, методы.
Синтаксис объявления структуры:
struct имя : интерфейсы {
// объявления членов
}
Пример описания структуры
public struct Book { // members public string Name; public int Price;
// constructor public Book(string name, int price) { Name = name; Price = price; } // methods public void Show() { Console.WriteLine(" Название книги {0}, Цена {1}", Name, Price); } }
В структурах нельзя определить деструктор.
Объект структуры может быть создан 2-мя способами: • без оператора new • с оператором new .
Создание структуры без оператор new
Book book; Так создается объект структуры без оператора new Но необходимо проинициализировать члены структуры.
Если не проинициализируем члены структуры будет ошибка: error CS0165: Use of unassigned local variable...
Пример создания структуры без оператор new:
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication1 { public struct Book { // members public string Name; public int Price; // methods public void Show() { Console.WriteLine("Название книги {0}, Цена {1}", Name, Price); } } class Program { static void Main(string[] args) {
// создаем структуру без оператора new Book book; // инициализируем данные структуры book.Name = "Волшебник Земноморья"; book.Price = 70; // Показываем результат на экране book.Show(); } } }
Создание структуры с оператором new, без параметров (по умолчанию)
Book book = new Book(); Так создается объект структуры с оператором new без параметров.
Вызовется конструктор по умолчанию (конструктор без параметров). Для структур мы не можем определить конструктор без параметров. Конструктор по умолчанию (конструктор без параметров), определяется для всех структур автоматически и его не видно в коде.
Пример
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { public struct Book { // members public string Name; public int Price;
// constructor public Book(String name, int price) { Name = name; Price = price; } // methods public void Show() { Console.WriteLine("Название книги {0}, Цена {1}", Name, Price); } }
class Program { static void Main(string[] args) {
// создаем объект структуры с оператором new без //параметров Book book = new Book(); // конструктор по умолчанию установит значения // Name = "" // Price = 0
// Показываем результат на экране book.Show(); } } } Можно инициализировать структуру в фигурных скобках
static void Main(string[] args) {
// создаем объект структуры с оператором new и // устанавливаем значения Book book = new Book() { Name = "Волшебник Земноморья", Price = 70 }; // Name = "Волшебник Земноморья" // Price = 70 // Показываем результат на экране book.Show(); }
Book book = new Book("Волшебник Земноморья", 90); Так создается объект структуры с оператором new с параметрами. Вызовется наш конструктор public Book(String name, int price) { ... }
Создание структуры с оператором new, с параметрами
Пример :
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { public struct Book { // members public string Name; public int Price ; // constructor
public Book(String name, int price) { Name = name; Price = price; }
// methods public void Show() { Console.WriteLine("Название книги {0}, Цена {1}", Name, Price); } } class Program { static void Main(string[] args) { // создаем объект структуры с оператором new с параметрами Book book = new Book("Волшебник Земноморья", 90); // наш конструктор установит значения // Name = "Волшебник Земноморья " // Price = 90 // Показываем результат на экране book.Show(); } } }
Структура не поддерживает наследование.
Структура может наследоваться только от interface
Пример структуры: наследование от interface
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { interface IBook { void Show();
} public struct Book : IBook { // members public string Name; public int Price;
public struct Book : IBook { // members public string Name; public int Price; // constructor public Book(String name, int price) { Name = name; Price = price; } // methods public void Show() { Console.WriteLine(" Название книги {0}, Цена {1}", Name, Price); } }
class Program { static void Main(string[] args) { // создаем объект структуры с оператором new с параметрами IBook book = new Book (" Волшебник Земноморья ", 70); // Показываем результат на экране book.Show();
} } }
Модификаторы доступа для методов, свойств, полей структуры в C#
Поля, методы, свойства в структуре имеют модификаторы доступа. Модификаторы доступа позволяют задать область видимости. То есть область видимости в которой можно употреблять данную переменную или метод.
p ublic - Публичный член структуры. Такой член структуры доступен из любого места в коде.
private - Закрытый член структуры. Такой член структуры не доступен для объекта структуры. Такой член структуры доступен только для методов структуры.
Пример : нет ошибок компиляции
struct Book { // поле структуры public string Name; // метод структуры public string GetInfo() { return "Название книги " + Name; // получаем значение из поля структуры } } class Program { static void Main(string[] args) { // создаем объект структуры Book book1 = new Book(); // устанавливаем значение для объекта структуры book1.Name = "aaa"; // вызываем метод GetInfo у объекта структуры string str1 = book1.GetInfo(); } }
Пример 2 ошибки компиляции
struct Book { // поле структуры private string Name; // метод структуры private string GetInfo() { return "Название книги " + Name; // получаем значение из поля структуры } } class Program { static void Main(string[] args) { // создаем объект структуры Book book1 = new Book(); // устанавливаем значение для объекта структуры book1.Name = "aaa"; // Ошибка компиляции! Book.Name is inaccessible due to its protection level // вызываем метод GetInfo у объекта структуры string str1 = book1.GetInfo(); // Ошибка компиляции ! Book.GetInfo() is inaccessible due to its protection level } }
Если не указать модификатор доступа, то по умолчанию ему будет присвоен private .
Модификаторы доступа структуры в C#
Структуры имеют модификаторы доступа . Модификаторы доступа позволяют задать область видимости.
Public - Общедоступная структура. Такая структура доступна из любого места в коде, а также из других программ и сборок. Пример public struct Book { ... }
Internal - Структура доступна из любого места кода в той же сборке, однако она недоступна для других программ и сборок. Пример internal struct Book { ... }
Не указав модификатор доступа структуре, по умолчанию будет присвоен internal .
Главное отличие структуры от класса это то что : Объект структуры содержит копию объекта (не ссылку)
Когда одна структура присваивается другой, создается копия объекта (не ссылка).
Переменная структуры это переменная типа. Переменная типа содержит данные, а не ссылку. В примере переменная b2 и b1 хранят отдельно данные Сами данные хранятся в стэке. Пример:
struct Book { public string Name ; }
class Program { static void Main (string[] args) { Book b1 = new Book(); b1.Name = "Book1" ; Book b2 = b1 ; b2.Name = "Book2" ; // b1.Name "Book1" // b2.Name "Book2" } }
Для чего нужны структуры?
Возникает вопрос зачем в C# нужна структура, если она обладает более скромными возможностями, чем класс? Ответ на этот вопрос заключается в повышении эффективности и производительности программ. Из соображений производительности лучше использовать структуры для небольших типов данных. Структуры относятся к типам значений, и поэтому ими можно оперировать непосредственно, а не по ссылке. Следовательно, для работы со структурой вообще не требуется переменная ссылочного типа, а это означает в ряде случаев существенную экономию оперативной памяти. Доступ к структуре осуществляется непосредственно , а к объектам — по ссылке , поскольку классы относятся к данным ссылочного типа. Косвенный характер доступа к объектам подразумевает дополнительные издержки вычислительных ресурсов на каждый такой доступ, тогда как обращение к структурам не влечет за собой подобные издержки.