Получение ссылки на элемент в списке - PullRequest
0 голосов
/ 05 мая 2018

Можно ли получить ссылку на элемент System :: Collections :: Generic :: List, когда T является типом значения?

Следующее создает предупреждение C4172, потому что значение, возвращаемое индексатором, является временной копией.

value struct
PluginInfo
{
    //...
};

List<PluginInfo^ pluginInfos = gcnew List<PluginInfo>();

PluginInfo%
GetPluginInfo(Handle handle)
{
    for (i32 i = 0; i < pluginInfos->Count; i++)
    {
        PluginInfo% pluginInfo = pluginInfos[i];
        if (pluginInfo.handle == handle)
        {
            return pluginInfo;
        }
    }
}

1 Ответ

0 голосов
/ 06 мая 2018

Нет, это невозможно.

Классы универсальных коллекций .NET были разработаны в то время, когда основные языки .NET (C #, VB.NET) не поддерживали возвраты byref. Таким образом, доступ к элементу осуществляется исключительно через (индексированную) пару getter / setter, где создаются копии.

Это также позволяет избежать недостатка прямого доступа к элементу в отсортированных коллекциях (например, SortedList или Dictionary), которые необходимо знать каждый раз, когда значение элемента изменяется, чтобы элемент мог быть перемещен в правильное новое местоположение в пределах коллекция. Чтобы поддерживать согласованный интерфейс, маловероятно, что даже новые коллекции будут использовать возвраты byref.

Рассматривали ли вы использование ссылочного типа в вашей коллекции? Даже если тип, который вы хотите сохранить, является типом значения, вы можете создать ссылочный класс, содержащий его в качестве члена, и это позволит вам передавать его с помощью семантики ссылок (конечно, за счет локальности памяти).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...