В цій статті
Визначення класу або структури подібно кресленням, на якому вказані дії, що виконуються типом. По суті, об'єкт є блоком пам'яті, виділеної і налаштованої відповідно до креслення. Програма може створити безліч об'єктів одного класу. Об'єкти також називають екземплярами. Вони можуть зберігатися або в іменованої змінної, або в масиві або колекції. Клієнтський код - це код, який використовує ці змінні для виклику методів і доступу до відкритих властивостями об'єкта. В об'єктно-орієнтованої мови, такому як C #, стандартна програма складається з декількох динамічно взаємодіючих об'єктів.
Примітка
Поведінка статичних типів відрізняється від описаного тут поведінки. Додаткові відомості див. У розділі Статичні класи і члени статичних класів.
Примірники структури і Примірники класів
Примірники класів створюються за допомогою оператора new. У наведеному нижче прикладі Person є типом, а person1 і person 2 - екземплярами або об'єктами цього типу.
Так як структури є типами значень, в змінної об'єкта структури зберігається копія всього об'єкта. Примірники структур також можна створювати за допомогою оператора new. проте він не є обов'язковим, як показано в наступному прикладі:
Пам'ять для p1 і p2 виділена в стеці потоку. Ця пам'ять звільняється разом з типом або методом, в якому вона оголошується. Ця одна з причин того, чому структури копіюються при присвоєнні. Навпаки, при виході всіх посилань на об'єкт з області впливу середовища CLR автоматично звільняє пам'ять (виконує складання сміття), виділену для екземпляра класу. Можливість детермінованого знищення об'єкта класу, що є в C ++, в даному випадку відсутній. Додаткові відомості про збірку сміття в .NET Framework см. На сторінці Збирання сміття.
Примітка
У середовищі CLR процес виділення і звільнення пам'яті в керованій купі значно оптимізований. У більшості випадків немає суттєвої різниці у витратах продуктивності на виділення екземпляра класу в купі і виділення примірника структури в стеці.
Ідентифікація об'єктів і рівність значень
Порівнюючи два об'єкти на предмет рівності, спочатку необхідно визначити, чи потрібно дізнатися, чи становлять дві змінні один об'єкт в пам'яті або значення одного або декількох їх полів є рівними. Якщо ви плануєте порівняти значення, слід вирішити, чи є об'єкти екземплярами типів значень (структурами) або посилальними типами (класами, делегатами, масивами).
Щоб визначити, чи посилаються два примірника класу на одне розташування в пам'яті (тобто мають однаковий ідентифікатор), скористайтеся статичним методом Equals. (System.Object є неявним базовим класом для всіх типів значень і посилальних типів, включаючи структури і класи, визначені користувачем.)
Щоб визначити, чи мають поля екземпляра в двох примірниках структури однакові значення, скористайтеся методом ValueType.Equals. Так як всі структури неявно успадковуються від System.ValueType. метод можна викликати безпосередньо в об'єкті, як показано в наступному прикладі:
У реалізації System.ValueType Equals використовується відображення, так як необхідно визначити поля, наявні в будь-якій структурі. При створенні власних структур перевизначите метод Equals для надання ефективного алгоритму рівності, відповідного вашому типу.
- Щоб визначити, чи рівні значення полів в двох примірниках класу, можна скористатися методом Equals або оператором ==. Однак їх слід використовувати, тільки якщо вони перевизначені або перевантажені класом з метою надання користувальницького визначення рівності для об'єктів цього типу. Клас може також реалізовувати інтерфейс IEquatable
або інтерфейс IEqualityComparer . Обидва інтерфейсу надають методи, які можна використовувати для перевірки рівності значень. При створенні власних класів, переобумовленої Equals. слід виконувати інструкції з розділів Практичний посібник. Визначення рівності значень для типу і Object.Equals (Object).