C # net 4
Мені останнім часом дуже часто зустрічаються програмісти, які не тільки використовують у звичайній "програмної" життя структури (struct), але взагалі, нічого не знають про цей об'єкт. І часто для просто ти свого "програмної" життя використовують завжди класи (class). У цій статті я б хотів в черговий раз зупинитися на відмінностях між структурами і класами.
Що таке struсture?
Ключовий момент статті. Чим більше Ви будете використовувати структури замість невеликих (напевно, правильніше буде сказати - маленьких) класів, тим менш витратним за ресурсами буде використання пам'яті. Смію припустити, що не потрібно пояснення чому ... "купа", "збирач сміття", "невизначені часові інтервали проходу", складність "ручного" управління купою і збирачем сміття. Всі ключові моменти вже перераховані.
Так само як і класи, структури можуть мати поля, методи і конструктори. Хоча про конструктори треба поговорити докладніше (буде далі по темі), бо це є дуже важливе поняття при порівнянні класів і структур.
Структури завжди з Вамін хочеться думати, що наступна інформація, для Вас сюрпризом. У мові C # примітивні числові типи int. long. float є Альяс для структур System.Int32. System.Int64 і System.Single відповідно. Ці структури мають поля і методи. Ви зазвичай викликаєте методи у змінних даних типів. Наприклад, кожна з перерахованих структур має метод ToString. Також у перерахованих структур є статичні поля, наприклад, Int32.MaxValue або Int32.MinValue. Виходить, що Ви вже в повсякденному "програмної" життя використовуєте структури, а значить знайомі з ними.
Таблиця класів і структур в Microsoft. NET Framework
У таблиці вказані Альяс і відповідні їм типи, а також подано інформацію про представляє типі (структура або клас).
На відміну від класів, використання публічних полів в структурах в більшості випадків не рекомендується, тому що не існує способу контролювання значень в них. Наприклад, будь-хто може встановить значення хвилин або секунд більше 60. Більш правильний варіант в даному випадку - використовувати властивості, а в конструкторі здійснити перевірку:
До речі, ... За замовчуванням, Ви не можете використовувати деякі загальні оператори в Ваших структурах. Наприклад, Ви не можете використовувати оператор порівняння (==) і протилежні йому (! =) На своїх структурах. Однак, Ви можете явно оголосити і реалізувати оператори для своїх структур.
І в чому ж різниця між структурами і класами
Давайте розглянемо приклад, в якому вже закладена помилка:
Причина виникнення помилки в тому, що Ви не можете використовувати конструктор за замовчуванням (без параметрів) для структури, тому що компілятор завжди генерує його сам. Що ж стосується класу, то компілятор створює конструктор за замовчуванням, тільки в тому випадку, якщо Ви його не створили. Згенерований конструктор для структури завжди встановлює поля в 0. false або null - як і для класів. Тому Ви можете бути впевненими в тому, що створена структура завжди буде вести себе "адекватно" відповідно до значень за замовчуванням в використовуваних типах. Якщо Ви не хочете використовувати значення за замовчуванням, Ви можете форматувати поля своїми значеннями в конструкторі з параметрами для ініціалізації. Однак, якщо в цьому конструкторі НЕ ініціалізується якесь значення, компілятор буде його форматувати за Вас і покаже помилку.
Перше правило Структури. Завжди всі змінні повинні бути ініційовані!
Дана таблиця до певної міри підсумовує все вищесказане і відображає основні відмінності між класами і структурами.
Використання структур як змінних
Після того як Ви створили структури, Ви можете використовувати її також як класи та інші типи. Наприклад, створивши структуру Time. я можу використовувати її в класі:
Ви можете створювати nullable версію змінної типу структури використовую модифікатор "?" І потім привласнити їй значення null:
Time? currentTime = null;
ініціалізація структур
У статті я не раз говорив, що поля структури можуть бути ініційовані при використання конструктора, причому не важливо якого "власного" або "за замовчуванням". До особливостей структур можна віднести ще й той факт, що внаслідок того, що структури є значущим типом, то можна створити структуру без використання конструктора, наприклад:
В такому випадку, змінна створюється, але поля НЕ будуть ініційовані відповідно параметрами конструктора.
висновок
Имхо, головна відмінність структур і класів: структури передаються за значенням (тобто копіюються), об'єкти класів - за посиланням. Саме це є найістотнішим відмінностями в їх поведінці, а не те, де вони зберігаються.
Примітка: структуру теж можна передати по посиланню, використовуючи модифікатори out і ref.
На мій прискіпливий погляд, стиль викладу кульгає. Багато неписьменних пропозицій. наприклад:
> До особливостей структур можна віднести ще й той факт, що внаслідок того, що структури є значущим типом, то створити структуру без використання конструктора, наприклад:
Таки створити структуру можна або не можна? Яке слово пропущене? Це називається, вгадай сам.
P.S. Бажаю до написання нових статей підходити більш ретельно, продумано.
До речі, ось ще глобальна помилка: назва статті починається зі слів .NET 4.0, а опис ведеться виключно за C #. Calabonga, при всій моїй до вас повазі, я не можу не затаврувати ганьбою цей матеріал. В MC ++ (C ++. NET) класи теж можна оголошувати на стеку. Думаю, цього прикладу досить.
>> У таблиці вказані Альяс і відповідні їм типи
Вбило наповал - що таке "Альяс". Може "псевдоніми"? Навіщо засмічувати українську мову, якщо є "рідний" термін.
"Ви можете створювати nullable версію."
Думка блогера. "What is nullable? Еее. Як це по російськи (чеше ріпу). А хер з ним, так і напишіть нулябл". (Ржот піт сталом). Версію статті давно пора обнулябліть :))
Дякую за статтю, дуже допомогла розібратися.
Тут згадали Ріхтера - ось він мені мізки і заморочив, хоча в цілому книги його безцінні.
The common language runtime (CLR) always allows the creation of value type instances, and there
is no way to prevent a value type from being instantiated. For this reason, value types do not actually even need to have a constructor defined within them, and the C # compiler does not emit default
parameterless constructors for value types.
Я правильно розумію, що тут сказано "C # не створює дефолтний конструктор".
А судячи зі статті, і по тому як взагалі структури поводяться - дефолтний к-р таки створюється.
Я по ходу Ріхтера не так зрозуміла?
Теж питання за Ріхтером:
при створенні екземпляра структури з ключовим словом new, де вона буде, на купі або в стеку. У книзі написано, що завжди в стеці, а на ITVDN говорили, що в цьому випадку в купі.
ASP.NET MVC: Як зробити PagedList на AJAX?
Як зробити Prism (MEF) додаток на Silverlight