Об'єкти (керівництво з програмування на c #), microsoft docs

В цій статті

Визначення класу або структури подібно кресленням, на якому вказані дії, що виконуються типом. По суті, об'єкт є блоком пам'яті, виділеної і налаштованої відповідно до креслення. Програма може створити безліч об'єктів одного класу. Об'єкти також називають екземплярами. Вони можуть зберігатися або в іменованої змінної, або в масиві або колекції. Клієнтський код - це код, який використовує ці змінні для виклику методів і доступу до відкритих властивостями об'єкта. В об'єктно-орієнтованої мови, такому як 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).

пов'язані теми