c#中的索引与内存一起工作

时间:2018-01-21 13:20:52

标签: c#

我开始在c#中解析主题索引器,并在运行测试任务时遇到问题:

Index.cs:

class Index
{
    double[] arr;
    public int Length
    {
        get;
        set;
    }
    public double this[int x]
    {
        get { return arr[x]; }
        set
        {
            arr[x] = value;
        }
    }
    public Index(double[] arr1, int x, int y)
    {    
        Length = y;    

        arr = arr1;

        for (int i = x; i <= y; i++)
        {
            if (i == 0)
            {
                arr[i] = arr1[i + 1];
            }
            else
            {
                arr[i - 1] = arr1[i];
            }
        }
    }
}

Program.cs的

static void Main(string[] args)
{
    double[] array = { 1, 2, 3, 4 };        
    var indexer0 = new Index(array, 1, 2);
    Console.WriteLine(indexer0.Length);
    Console.WriteLine("Result = 2,3");       
    var indexer1 = new Index(array, 1, 2);
    Console.WriteLine(indexer1[0]);
    Console.WriteLine(indexer1[1]);
    Console.WriteLine("Copy 25");        
    var indexer2 = new Index(array, 1, 2);
    var indexer3 = new Index(array, 0, 2);
    indexer2[0] = 25;
    Console.WriteLine(indexer3[1]);
    Console.WriteLine("Array");
    foreach(var item in array)
    {
        Console.WriteLine(item);
    }

    Console.ReadKey();
}

正如您在调用indexer1后所看到的,我希望数组值更改为2和3,然后我得到3.3(我知道这是因为当我调用indexer0时我更改了值到2.3,然后我使用数组2,3,3,4,我可以通过将值写入临时变量来修复此问题,但是我无法将值从indexer2复制到indexer3(所需的值为25。请帮我处理其中两个问题。

1 个答案:

答案 0 :(得分:5)

您的实现问题是您没有制作原始数组的副本。这将创建对同一数组的第二个引用

 arr = arr1;

循环内部的修改,就像这个,

arr[i] = arr1[i + 1];

正在四处移动并覆盖原始数组的元素。

通过分配新数组并将原始数据的内容复制到其中来解决此问题:

public int Length { get { return arr.Length; } }
public Index(double[] arr1, int x, int y) {
    arr = new double[y];
    Array.Copy(arr1, x, arr, 0, y);
}

请注意,您的Index将包含原始数组的副本。如果你想要一个&#34;窗口&#34;进入原始数组,而不是副本(即通过Mainarray等可以看到对index1 index2的更改。存储{{1}不变,并且还将初始索引存储在私有变量中。您现在可以将索引器实现更改为&#34;索引转换&#34;,即从arr中减去存储的x以获取正确的指数:

index

Demo.