避免数组递归集(C#)

时间:2018-04-23 06:20:53

标签: c# arrays methods

Class MyClass
{
    public int[] MyArray
    {
        get {return MyArray;}
        set
        {
            if (value == null) { MyArray = new int[2] { 0, 0 }; return;}
            else { MyArray = value; return;}
        }
    }
    public MyClass()
    {
        this.MyArray = new int[2] { 0, 0 };
    }
}

在我的课程中,我有一个int[],我需要在value中使用set进行操作,除非我尝试创建MyClass的新实例时我得到了堆栈溢出。

当我在构造函数上放置断点时,在set上它显示构造函数中的myArray = new int[2] {0, 0};调用set方法,一旦集合到达行myArray = value,它再次调用set方法。这循环一段时间,然后抛出堆栈溢出异常。我已经尝试在转让后立即return;,但它没有达到回报。

对数组使用set方法的任何启示都很棒。

2 个答案:

答案 0 :(得分:3)

如果您的getset有正文,则需要一个您缺少的支持字段。

class MyClass
{
    private int[] _myArray;

    public int[] MyArray
    {
        get {return _myArray;}
        set
        {
            if (value == null) { _myArray = new int[2] { 0, 0 }; }
            else { _myArray = value; }
        }
    }
    public MyClass()
    {
        this.MyArray = new int[2] { 0, 0 };
    }
}

在此代码中,私有字段_myArray被用作属性的支持字段。

答案 1 :(得分:1)

问题在于您指向相同的内存空间:

public int[] MyArray
{
    get {return MyArray;}
    ...
}

访问媒体资源myArray将访问您的媒体资源myArray,这将导致访问相同的媒体资源!

对此的回答是使用private variable,它只能直接从您的班级编写。而public property只会访问此变量。

像这样:

class MyClass
{
    private int[] _myArray;
    public int[] MyArray
    {
        get { return _myArray; }
        set
        {
            if (value == null) { _myArray = new int[2] { 0, 0 }; return; }
            else { _myArray = value; return; }
        }
    }
}

可以找到更多详细信息,例如on DotNetPerlsMS Official page