获取对列表中元素的引用
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 对完成,在该对中进行复制。
这也避免了排序集合中直接访问元素的缺点(例如SortedList
或Dictionary
),每次元素值更改时都需要知道,以便可以将项目移动到集合中正确的新位置。为了保持一致的界面,即使是全新的集合也不太可能使用 byref returns.
您是否考虑过在集合中使用引用类型?即使您要存储的类型是值类型,您也可以创建一个包含它作为成员的引用 class,这样您就可以通过引用语义传递它(当然是以内存局部性为代价的) ).
当 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 对完成,在该对中进行复制。
这也避免了排序集合中直接访问元素的缺点(例如SortedList
或Dictionary
),每次元素值更改时都需要知道,以便可以将项目移动到集合中正确的新位置。为了保持一致的界面,即使是全新的集合也不太可能使用 byref returns.
您是否考虑过在集合中使用引用类型?即使您要存储的类型是值类型,您也可以创建一个包含它作为成员的引用 class,这样您就可以通过引用语义传递它(当然是以内存局部性为代价的) ).