我遇到了一个非常有趣的运行时错误,它会产生一个流氓堆栈溢出.
我已经定义了如下结构:
public enum EnumDataType { Raspberry, Orange, Pear, Apple };
public class DataRequest
{
public long DataSize
{
get { return 0; }
set { DataSize = value; }
}
public EnumDataType DataType
{
get { return EnumDataType.Apple; }
set { DataType = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
以下几行非常有效:
DataRequest request = new DataRequest();
request.DataSize = 60;
Run Code Online (Sandbox Code Playgroud)
但是,当我在代码中跳过以下行时,它会生成堆栈溢出:
request.DataType = EnumDataType.Raspberry;
Run Code Online (Sandbox Code Playgroud)
当然,我可以通过删除默认值或使用auto get/set来修复它,但我需要它既可读又可写,并返回默认值 - 任何想法?
Nei*_*ght 19
public long DataSize { get { return 0; } set { DataSize = value; } }
Run Code Online (Sandbox Code Playgroud)
你一直在设定价值DataSize.您需要创建一个局部变量并使用它.例如
private long dataSize;
public long DataSize
{
get { return this.dataSize; }
set { this.dataSize = value; }
}
Run Code Online (Sandbox Code Playgroud)
编辑
我写过,DataSize但同样适用DataType
Jon*_*eet 12
正如其他人所说,堆栈溢出的发生是因为你的属性设置器只是调用它自己.如果您将其视为一种方法,可能更容易理解:
// This obviously recurses until it blows up
public void SetDataType(long value)
{
SetDataType(value);
}
Run Code Online (Sandbox Code Playgroud)
据我所知,你试图创建普通的属性但是有一个默认值,对吧?
在这种情况下,您需要支持由setter设置的变量 - 并且getter也应该返回这些变量.这是应该获得默认值的变量:
private long dataSize = 0;
public long DataSize {
get { return dataSize; }
set { dataSize = value; }
}
private EnumDataType dataType = EnumDataType.Apple;
public EnumDataType DataType {
get { return dataType; }
set { dataType = value; }
}
Run Code Online (Sandbox Code Playgroud)
或者,使用自动属性,但在构造函数中设置默认值:
public long DataSize { get; set; }
public EnumDataType DataType { get; set; }
public DataRequest()
{
DataSize = 0; // Not really required; default anyway
DataType = EnumDataType.Apple;
}
Run Code Online (Sandbox Code Playgroud)