Stack overflow error in C# - but how to fix it?

前端 未结 5 1160
旧时难觅i
旧时难觅i 2021-01-05 07:50

I\'ve run into a really interesting runtime bug which generates a rogue stack overflow.

I\'ve defined a structure as follows:

public enum EnumDataTy         


        
相关标签:
5条回答
  • 2021-01-05 07:51

    stack overflow happens because in the setter you are setting the property to a value (Ie you are trying to get something to set itself to something ... which causes an infinite loop) ... which means that it tries to set itself to a value which means its tries to set itself to a value untill boom

    your properties will never get the values you are setting because they always return the same value (not the stored value)

    public enum EnumDataType { Raspberry, Orange, Pear, Apple }; 
    
    public class DataRequest 
    { 
    private long _dataSize = 0;
    private EnumDataType _dataType = EnumDataType.Apple;
    
    public long DataSize { get { return _dataSize ; } set { _dataSixe= value; } } 
    public EnumDataType DataType  { get { return _dataType; } set { _dataType= value; } } 
    } 
    

    is what you really wanted

    0 讨论(0)
  • 2021-01-05 07:58
    public long DataSize { get { return 0; } set { DataSize = value; } } 
    

    You are constantly setting the value of DataSize. You need to create a local variable and use that instead. e.g.

    private long dataSize;
    
    public long DataSize
    {
        get { return this.dataSize; }
        set { this.dataSize = value; }
    }
    

    EDIT I've written DataSize but the same applies to DataType

    0 讨论(0)
  • 2021-01-05 08:03

    I don't understand how the first line: request.DataSize = 60;

    Doesn't cause a stack overflow - my advice would be to use backing properties:

    public class DataRequest
    {
        protected int dataSize = 0;
        protected EnumDataType enumDataType;
        public long DataSize { get { return 0; } set { dataSize = value; } }
        public EnumDataType DataType  { get { return EnumDataType.Apple; } set { enumDataType = value;} 
    }
    
    0 讨论(0)
  • 2021-01-05 08:12

    As others have said, the stack overflow occurs because your property setter is just calling itself. It may be simpler to understand if you think of it as a method:

    // This obviously recurses until it blows up
    public void SetDataType(long value)
    {
        SetDataType(value);
    }
    

    As I understand it, you're trying to create normal properties but with a default value, right?

    In that case, you need backing variables which are set by the setters - and the getters should return those variables, too. It's the variables which should get default values:

    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; }
    }
    

    Alternatively, use automatic properties but set the defaults in your constructor:

    public long DataSize { get; set; }
    public EnumDataType DataType { get; set; }
    
    public DataRequest()
    {
        DataSize = 0; // Not really required; default anyway
        DataType = EnumDataType.Apple;
    }
    
    0 讨论(0)
  • 2021-01-05 08:16

    you have to implemet it with a backing store:

    private EnumDataType dataType;
    public EnumDataType DataType  { get { return EnumDataType.Apple; } set { dataType = value; } }
    

    }

    You should do so anytime you do some acion in the getter and setters. By the way, why can you even set the variables? you can't read them out, you always get EnumDataType.Apple. If you want a start value, you can do like this:

    private EnumDataType dataType = EnumDataType.Apple;
    public EnumDataType
    {
       get
       {
           return dataType;
       }
       set
       {
           dataType = value;
       }
     }
    
    0 讨论(0)
提交回复
热议问题