将结构引用添加到C#列表中

Adi*_*Adi 6 c#

试图保持我的C#代码优化,我发现如果我有一个结构元素列表,每个插入将是一个完整的副本 - 我想避免的东西.

在C++中,我只是保留一个指针列表,所以我想知道我是否可以使用C#做同样的事情,也许将列表作为结构的引用列表.不幸的是,结构不能变成一个类,因为它是XNA库的一部分(Vector3,Matrix等).无论如何 - 如果可能,格式和用法会如何?

谢谢.

Dan*_*ant 5

您无法在C#中创建对结构的可存储引用,但您可以为您的值类型创建引用类型包装器.也就是说,与复制内存相关的开销对于小型结构来说不会很高.您的分析是否表明这是一个问题?


下面是包含在引用类型中的值类型的示例.请注意,这仅适用于对特定值的所有访问都是通过包装引用类型的情况.这违反了标准的绝缘规则(因为公共领域),但这是一个特例.

public sealed class Reference<T>
    where T: struct
{
    public T Value;

    public Reference(T value)
    {
        Value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

另一件值得注意的事情是,Reference包装器本身可以采用null值,尽管它的内容是不可为空的.如果您愿意,还可以添加隐式或显式转换运算符以使其更透明.


Mar*_*ell 5

不,基本上.选项:

  • 使用一个类(你已经说过你不能)
  • 盒子吧
  • 写一个包装它的类(基本上是手动装箱)
  • 使用数组,并且只能通过索引直接在数组中访问它(不需要复制到变量中); 然后直接与数组中的项目对话(无副本)

作为最后一个例子;

if(arr[idx].X == 20) SomeMethod(ref arr[idx]);
Run Code Online (Sandbox Code Playgroud)

.X和SomeMethod中的任何用法都是直接在数组中访问值,而不是副本.这仅适用于矢量(数组),而不是列表.

建立refs列表的一个原因是不可能的:它允许你在列表中存储堆栈中变量的地址; 数组通常比堆栈上的变量更长,所以这将是非常不安全的