获取对列表中元素的引用

Getting a reference to an element in a List

当 T 是值类型时,是否可以获得对 System::Collections::Generic::List 元素的引用?

以下生成警告 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;
        }
    }
}

不,这不可能。

.NET 泛型集合 classes 是在主要的 .NET 语言(C#,VB.NET)不支持 byref returns 的时候设计的。因此,元素访问仅通过(索引)getter/setter 对完成,在该对中进行复制。

这也避免了排序集合中直接访问元素的缺点(例如SortedListDictionary),每次元素值更改时都需要知道,以便可以将项目移动到集合中正确的新位置。为了保持一致的界面,即使是全新的集合也不太可能使用 byref returns.

您是否考虑过在集合中使用引用类型?即使您要存储的类型是值类型,您也可以创建一个包含它作为成员的引用 class,这样您就可以通过引用语义传递它(当然是以内存局部性为代价的) ).