Структури та відкриті поля полегшать сумісність з деякими не керованими API. Часто ви виявите, що API низького рівня хоче отримати доступ до значень за посиланням, що добре для продуктивності (оскільки ми уникаємо зайвої копії). Використання властивостей є перешкодою до цього, і часто бібліотеки обгортки роблять копії для зручності використання, а іноді і для безпеки.
Через це ви часто будете отримувати кращі показники, маючи векторні та матричні типи, які не мають властивостей, а голі поля.
Найкращі практики - це не створення вакууму. Незважаючи на деякий культовий культ, загалом найкращі практики існують з вагомих причин.
У цьому випадку у нас є пара:
Властивість дозволяє змінювати реалізацію без зміни коду клієнта (на бінарному рівні можна змінити поле на властивість без зміни коду клієнта на вихідному рівні, проте після зміни він буде компілюватися на щось інше) . Це означає, що, використовуючи властивість з самого початку, код, на який посилається ваш, не доведеться перекомпілювати лише для того, щоб змінити те, що робить властивість внутрішньо.
Якщо не всі можливі значення полів вашого типу є дійсними станами, то ви не хочете піддавати їх клієнтському коду, який змінює його. Таким чином, якщо деякі комбінації значень недійсні, потрібно зберегти поля приватними (або внутрішніми).
Я казав код клієнта. Це означає код, який викликає ваш. Якщо ви не створюєте бібліотеку (або навіть створюєте бібліотеку, але використовуєте внутрішню, а не загальнодоступну), зазвичай ви можете піти з нею і з хорошою дисципліною. У цій ситуації найкраща практика використання властивостей є для запобігання стрілянині в ногу. Крім того, міркувати про код набагато простіше, якщо ви бачите всі місця, де поле може змінюватись в одному файлі, замість того, щоб турбуватися про те, що воно чи не змінюється десь в іншому місці. Насправді властивості також добре ставити точки прориву, коли ви з'ясовуєте, що пішло не так.
Так, є цінність бачити те, що робиться в галузі. Однак у вас є мотивація йти проти кращих практик? чи ти просто противодишся найкращим практикам - ускладнюючи розгляд коду - просто тому, що це робив хтось інший? Ах, до речі, "інші роблять це" - це те, як ви починаєте вантажний культ.
Отже ... Ваша гра працює повільно? Вам краще приділити час, щоб з'ясувати вузьке місце і виправити це, а не міркувати, що це може бути. Ви можете бути впевнені, що компілятор зробить багато оптимізацій, через це, швидше за все, ви переглядаєте неправильну проблему.
З іншого боку, якщо ви вирішите з чого почати, то вам слід потурбуватися про те, які алгоритми та структури даних спочатку, а не турбуватися про більш дрібні деталі, такі як поля проти властивостей.
Нарешті, чи заробляєте ви щось, ідучи проти кращих практик?
Для деталей вашого випадку (Unity та Mono для Android), чи Unity приймає значення за посиланням? Якщо це не так, він все одно скопіює значення, жодного посилення продуктивності там немає.
Якщо це так, якщо ви передаєте ці дані в API, який приймає посилання. Чи має сенс оприлюднювати поле, або ви можете зробити тип, здатний викликати API безпосередньо?
Так, звичайно, можуть бути оптимізації, які можна зробити, використовуючи структури з оголеними полями. Наприклад, ви отримуєте доступ до них за допомогою покажчиків Span<T>
чи подібних. Вони також компактні в пам'яті, що дозволяє їх легко серіалізувати для надсилання по мережі або для постійного зберігання (і так, це копії).
Тепер, чи вибрали ви правильні алгоритми та структури, якщо вони виявляться вузьким місцем, то ви вирішите, який найкращий спосіб виправити це ... що може бути з голими полями чи ні. Ви зможете турбуватися про це, якщо і коли це станеться. Тим часом ви можете турбуватися про більш важливі справи, такі як зробити гарну чи веселу гру, в яку варто грати.