Структури як поля
Відомо, що структури - це значущі типи, а значить передаються за значенням. І це стає проблемою, коли хочеться використовувати готові структури як поля або властивості класів. З ними стає неможливо працювати, так при спробі змінити якісь поля в структурі (яке є властивістю або полем), компілятор кричить про помилку.
В принципі нічого дивного, це очікуване поведінка, що викликає коду відправляється копія структури і компілятор дає зрозуміти, що ти зміниш копію, але це ні на що не вплине. Це зрозуміло, але як бути?
В даному випадку, змінити Coordinates.X з зовнішнього коду буде неможливо. Яка практика роботи зі структурами як полями / властивостями? На вищевказаному прикладі, як змінити структуру?
заданий 11 Серпня '16 о 15:28
@YesMan: Поле не "передається по посиланню». Ви просто працюєте з самим полем, lvalue в термінах C ++. А ось геттер властивості - це звичайна функція, а значить, як і будь-яка функція, він завжди повертає копію значення для значущих типів (і копію посилання для посилальних типів). - VladD 15 Серпня '16 о 17:54
Структури зазвичай потрібні для того, щоб отримати можливість виконати одну операцію, наприклад порівняння або привласнення, над групою даних, в тому числі різнорідних. Я не хочу сказати що структури потрібно списати в архів, просто багато завдань, які вирішувалися і вирішуються за допомогою структур в інших мовах, в C # успішніше вирішують повноцінні класи.
У вихідному коді класу System.Windows.Forms.Control. можна подивитися реалізацію властивості Size. як приклад того, як Microsoft використовує структури.
У контрола є поля width і height. Однойменні властивості Width і Height і властивість Size. яке повертає значення width і height у вигляді однієї структури типу System.Drawing.Size. Для змін розмірів у вас є цілих два шляхи: задати ширину і висоту окремо через відповідні властивості, або встановити обидва розміру відразу за допомогою структури Size. наприклад скопійованої з іншого контрола.
Якщо розглянути властивість Location. то знайти окремі властивості для X і Y не вийде, їх просто немає, хоча всередині використовуються окремі поля x і y для зберігання координат. В принципі, можна було і всередині використовувати структуру, тому що координати точки досить рідко використовуються по-окремо.
На мій погляд - це досить непоганий приклад практичного застосування структур з урахуванням їх особливостей.
У Microsoft є і менш вдалі приклади, наприклад властивість Control.Font. в якому здається досить дивним, не мати можливості вказати, наприклад атрибут шрифту Bold без заміни всієї структури Font. але якщо уважно придивитися до ісходникам можна помітити, що це властивість пов'язана з некерованим кодом WinAPI і швидше за все особливого вибору не було, не рахуючи звичайно нереального на практиці варіанти "швиденько запив новий API".
Застосовуйте наявні інструменти за призначенням (в різних мовах воно може бути різним, це нормально).
відповідь дан 11 Серпня '16 о 16:27