gpt4 book ai didi

c# - 从 C# 中的列表中获取引用/地址

转载 作者:太空狗 更新时间:2023-10-29 21:02:19 27 4
gpt4 key购买 nike

我知道 C# 不处理指针,但我想知道当我知道它的第一个元素时是否可以获得对列表的引用?例如:假设我有一个列表定义为

List<T> abc  

如果我有 abc[0],我可以得到 abc 的引用吗?我是 C# 的新手,如果我的问题看起来很奇怪,我深表歉意。在 C/C++ 中,我可以使用 &abc[0] 获取数组 abc 的地址。当我们知道集合中的一项时,C# 是否为我们提供了类似的工具来帮助我们回溯集合本身?谢谢,

最佳答案

现在可以通过使用 System.Runtime.InteropServices.CollectionsMarshal.AsSpan 方法从 .NET 5.0 开始。

如文档所示,在使用范围或从范围中获取的项目引用时,不应将项目添加到列表或从列表中删除。从技术上讲,这也应该扩展为 Capacity 不应更改,也不应调用 TrimExcess()。如果在主动使用跨度或其引用的同时使用这些操作,则列表的内部内存可能不再与跨度中的内存相同。

// Create a simple list with three items.
var list = new List<int>();
list.Add(123);
list.Add(456);
list.Add(789);

// Print list to console.
Console.WriteLine("List items:");
foreach (var item in list)
Console.WriteLine(item);
Console.WriteLine();

// Get a reference to the second item in the list.
// WARNING: DO NOT ADD/REMOVE ITEMS FROM THE LIST WHILE USING THIS SPAN
// OR ANY REFERENCES DERIVED FROM THIS SPAN!
var listSpan = CollectionsMarshal.AsSpan(list);
ref var secondItem = ref listSpan[1];
Console.WriteLine($"Referenced value (original): {secondItem}");

// Change the referenced list item.
secondItem = 0;
Console.WriteLine($"Referenced value (modified): {secondItem}");
Console.WriteLine();

// Print the list to console.
Console.WriteLine("List items:");
foreach (var item in list)
Console.WriteLine(item);
Console.WriteLine();

你应该得到这样的输出:

List items:
123
456
789

Referenced value (original): 456
Referenced value (modified): 0

List items:
123
0
789

关于c# - 从 C# 中的列表中获取引用/地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12354249/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com