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方法的任何启示都很棒。
答案 0 :(得分:3)
如果您的get
和set
有正文,则需要一个您缺少的支持字段。
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 DotNetPerls或MS Official page。