Структури в колекціях

Я хотів би зберегти посилання на купу структур у збірці. Загальні ліси виглядають так:

Structure myStructType
  Dim prop1 as String
  Dim prop2 as int
End Structure


Dim myList as new List(Of myStructType)()

'Wrongness below
Dim myStruct as new myStructType()
myStruct.prop1 = "struct1"
myStruct.prop2 = 1
myList.Add(myStruct)

myStruct = new myStructType()
mystruct.prop1 = "number two"
mystruct.prop2 = 2
myList.Add(myStruct)

тепер це не працює, тому що він посилається на ту саму пам'ять. Те, що я дійсно хотів би, це поведінка "Посилання за значенням", яка також використовується для типів референції, щоб я міг легко продовжувати створювати більше з них.

Чи існує якийсь спосіб вирішити це інше, ніж зробити структури класами? Чи це насправді є належним способом використання структур, чи я все це неправильно?

0
@ Ханс, дякую Отже, якщо я розумію вас правильно, коли я передаю змінну, що містить тип значення, я насправді передаю копію значення, що міститься у змінній? Здається, має сенс.
додано Автор Martijn, джерело
Код працює нормально, myStructType - це тип значення. У списку зберігаються копії структури. Спробуй це.
додано Автор Hans Passant, джерело

1 Відповіді

Цей код робить те саме, незалежно від структури або класу, оскільки ви використовуєте new myStructType() для кожного об'єкта. Отож, майте на увазі, що пізніше вилучення та модифікація цих об'єктів myStructType поводяться по-різному. Якщо воно вичерпується в структурі, то ви копіюєте дані на вилучення, залишаючи оригінал недоторканим у списку. Якщо він вичерпується з класу, то ви отримуєте посилання на цей об'єкт, і зміни, зроблені за допомогою цієї посилання, змінюють екземпляр у списку.

Я як і раніше задаюсь питанням, що ви намагаєтесь виконати (або уникати), використовуючи структури, а не класи?

1
додано
Це лише 3 біти даних, без будь-яких операцій на них. Оскільки така структура є саме те, що вона є.
додано Автор Martijn, джерело
Для мого виходу, просто тому, що вони легші. Але також тому, що вони дійсно малі, і я визнаю їх рівними, якщо вони мають рівноцінність цінності (не те, що я планую використовувати його), і вони не будуть змінюватися після ініціалізації.
додано Автор Martijn, джерело
Майте на увазі, що проходження навколо структури (кожне призначення або використання як параметр) копіює весь розмір структури. Отже, якщо у вас struct було три 4-байтних поля (наприклад, цілі чи строкові посилання), ви копіюєте 12 байтів кожного разу. Ті самі дані в класі будуть копіювати лише 4 байтів у тому самому сценарії. Набагато ефективніше.
додано Автор tcarvin, джерело
Але яка перевага ви бачите, що структура має над класом? Я думаю, ви побачите, що це ніхто. Якщо ви плануєте модифікувати членів пізніше, то обов'язково використовуйте клас.
додано Автор Chris Dunaway, джерело
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug