【问题标题】:C#: Using a generic to create a pointer arrayC#:使用泛型创建指针数组
【发布时间】:2010-12-10 13:05:53
【问题描述】:

下午好,

请帮忙。为了规避 .NET 中的 2Gb 对象限制,我创建了一个在堆上分配内存的类,这使我可以创建不超过可用 RAM 限制的数组。然而,为了便于开发(因为它是一个概念证明),它被硬编码为 long。现在它可以工作了,我一直在尝试更改代码以使用泛型,以便我可以将相同的代码用于多种类型。

在分配内存和正确索引数组时,我需要一个与数组将保存的类型相同的指针数组,即长数组需要long*[] myLargeArray。问题是当我使用泛型时,这个声明变成了T*[] myLargeArray,它总是产生错误'Cannot take the address of, get the size of, or declare a pointer to a managed type ('T') '

提前致谢。

PS 在有人问之前,是的,我确实需要这么大的数组。

二维数组的代码示例:


    LargeArray <int> myArray = new LargeArray<int>(x, y);

    public unsafe class LargeArray where T : struct
    {
        ...
        private T*[] tArr;
        ...
        public LargeArray(long sizeI, long sizeJ)
        {
            ...
            myLargeArray = new T*[sizeI];
            ...
        }
    }

【问题讨论】:

    标签: c# generics pointers


    【解决方案1】:

    根据C# programming guide

    以下任何类型都可能是 指针类型:

    • sbyte、byte、short、ushort、int、uint、long、ulong、char、float、 double、decimal 或 bool
    • 任何枚举类型。
    • 任何指针类型。
    • 任何包含非托管类型字段的用户定义结构类型 仅限。

    当您在泛型类型上放置struct 约束时,编译器没有足够的信息来推断上述所有要求都将得到满足(特别是最后一点)。

    由于我们在 C# 中没有模板,您可能需要考虑为有意义的数字类型创建数组/指针适配器的重载,或者在给定大小的情况下创建 LargeArray 的工厂类输入。

    【讨论】:

    • 我认为工厂模式绝对是这里的必经之路。
    【解决方案2】:

    来自 MSDN

    即使与 unsafe 一起使用 关键字,取一个地址 托管对象,获取大小 托管对象,或声明一个指针 不允许使用托管类型。为了 更多信息,请参阅Unsafe Code and Pointers (C# Programming Guide).

    我也不知道你是不是,但请确保你在代码中使用了fixed keyword

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      相关资源
      最近更新 更多