【问题标题】:Array.Copy exceptionArray.Copy 异常
【发布时间】:2017-05-04 10:03:21
【问题描述】:

我正在尝试使用Array.Copy C# 中内置的static 方法来增加数组的大小。 代码如下:

public class MyClass
{
    private int Capacity { get; set; }
    private int Size { get; set; }
    private int[] Nodes { get; set; }

    public MyClass()
    {
        Capacity = 5;
        Size = 0;
        Nodes = new int[Capacity];
    }

    public void EnlargeIfNeeded()
    {
        if (Size == Capacity)
        {
            Capacity = 2 * Capacity;
            Array.Copy(Nodes, Nodes, Capacity);
        }
    }
}

当调用EnlargeIfNeeded() 方法时,它会抛出以下异常:

system.argument.exception:源数组不够长。查看 srcIndex 和长度,以及数组的下界

可以使用下面的吗?我的单元测试通过了,现在:

    public void EnlargeIfNeeded()
    {
        if (Size == Capacity)
        {
            Capacity = 2 * Capacity;
            var dest = new int[Capacity];
            Array.Copy(Nodes, dest, Capacity/2);
            Nodes = dest;
        }
    }

【问题讨论】:

  • 您是否期望将字段Capacity 加倍会影响阵列Nodes 的实际容量? Array.Copy当然不会那样做。
  • 是的,我的最终目的是使阵列容量翻倍。
  • 我建议您仔细阅读Array.Copy 的文档。您目前没有正确使用它。您可能想改用Nodes = Array.Resize(Nodes, Capacity)。但是你为什么要彻底改造List<T>
  • 谢谢,我不想重新发明任何东西。我只是想只使用语言内置的基础知识。

标签: c# arrays exception


【解决方案1】:

如果您尝试调整数组大小,使用 List 集合可能是更好的方法,因为它以更有效的方式原生实现数组调整大小。

https://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx

【讨论】:

  • 我的要求是使用一个数组(int[])。谢谢你的建议。
  • 所以... Array.Resize(ref Nodes, Capacity);
  • 抱歉,无法使用 Array.Resize(ref Nodes, Capacity)。编译时错误:ref 关键字不能在属性或索引器中使用
  • 尝试将数组封装在属性之外,例如:private int[] Nodes;
  • hmm... int[] 节点应该是我班级的内部字段。它认为我们做不到。我猜您的意思是使用“字段”而不是“属性”。非常感谢!
【解决方案2】:

看起来你只想要Array.Resize

另外,我建议删除Capacity 成员,这样你就没有多少状态可以照顾自己了。 (注意:下面是干编码的,所以是 YMMV。)

public class MyClass
{
    private int Size { get; set; }
    private int[] Nodes { get; set; }

    public MyClass()
    {
        Size = 0;
        Nodes = new int[5];
    }

    public void EnlargeIfNeeded()
    {
        if (Size == Nodes.Length)
        {
            Array.Resize(ref Nodes, Nodes.Length * 2);
        }
    }
}

编辑:添加了缺少的 ref 关键字。

【讨论】:

  • 使用您的代码,我收到一个错误:参数 1 必须使用 'ref' 关键字传递,在行:Array.Resize(Nodes, Nodes.Length * 2)
  • @JoanDimko:很好。添加了关键字。
  • 你应该让 int[] 节点成为一个字段
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多