C#中的堆栈溢出错误 - 但如何解决?

Con*_*ngo 5 c# stack-overflow

我遇到了一个非常有趣的运行时错误,它会产生一个流氓堆栈溢出.

我已经定义了如下结构:

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

  • -1:这仍然*总是*返回0而不是只是使0**default*值.不可否认,这个问题并不清楚,但我认为这并不意味着什么. (2认同)

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)