2015-10-06 78 views
3

我有以下代码:StackOverflow的异常get和set

namespace QuantStrats 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string FilePath = "C:\\Users\\files\\DJ.csv"; 
      StreamReader streamReader = new StreamReader(FilePath); 
      string line; 
      List<Data> Data = new List<Data>();  

      while ((line = streamReader.ReadLine()) != null) 
      { 
       Data Tick = new Data(); 
       string [] values = line.Split(','); 
       Tick.SetFields(values[1], values[2]); 
       Data.Add(Tick); 
      } 

      for (int ii = 0; ii < Data.Count; ii++) 
      { 
       Data TickDataValues = new Data(); 
       TickDataValues = Data[ii];    
       Console.Write("TIME :" + TickDataValues.time + " Price : " + TickDataValues.price + Environment.NewLine); 
      } 

      Console.ReadLine(); 
     } 
    } 

    class Data 
    { 
     public DateTime time 
     { 
      get { return this.time; } 
      set 
      { 
       this.time = value;     
      } 
     } 

     public double price 
     { 
      get { return this.price; } 
      set 
      { 
       this.price = value;     
      } 
     } 

     public void SetFields(string dateTimeValue, string PriceValue) 
     { 
      try 
      { 
       this.time = Convert.ToDateTime(dateTimeValue); 
      } 
      catch 
      { 
       Console.WriteLine("DateTimeFailed " + dateTimeValue + Environment.NewLine); 
      } 

      try 
      { 
       this.price = Convert.ToDouble(PriceValue); 
      } 
      catch 
      { 
       Console.WriteLine("PriceFailed " + PriceValue + Environment.NewLine); 
      } 
     } 
    } 
} 

但我得到一个堆栈溢出异常。

我知道这是因为我没有做我的get和设置正确,我正在进入一个无限循环,但我不明白为什么会发生这种情况?

回答

7
public DateTime time 
{ 
    get { return this.time; } 
    set 
    { 
     this.time = value;     
    } 
} 

您不使用后备字段,而是在属性设置器中设置属性本身。

可以使用1固定这一点)自动属性

public DateTime Time { get; set; } 

或2)背场

private DateTime _time; 
public Datetime Time 
{ 
    get { return _time; } 
    set { _time = value; } 
} 

它们都等同于相同的代码。

有关说明,当你在你的代码time

get { return this.time; } 

它具有检索的time的价值回归。它是通过调用timeget,其中有获得检索time值等

+1

备份*字段*,不支持属性。 –

+0

是的,谢谢@JonSkeet,努力成为第一名,打字速度过快 – Jonesopolis

+1

绝对是#1的首选,除非您在设置/获取属性时需要额外的验证或其他逻辑。 –

2

我不明白到底为什么发生这种情况?

public double price 
    { 
     get { return this.price; } 
     set 
     { 
      this.price = value;     
     } 
    } 

当你 “获得” price,为price吸气剂被调用,这就要求price的getter,它调用getter方法price,这...

只需使用自动实现性能,如果你不想惹支持字段:

public DateTime Time {get; set;} 
    public double Price {get; set;} 

其他一些意见:

  1. 属性名称的标准约定是以大写字母开头,这就是我在示例中将属性更改为TimePrice的原因。

  2. 你可能要考虑使用decimalPrice的属性,如果你做任何浮点运算,因为double有一些轻微的不精确性表示十进制数的1.1一样的时候。 decimal将存储数字exacly没有任何精度损失。

  3. 只写入控制台的catch块看起来不正确。你基本上忽略了错误(从逻辑流程的角度来看)。与其接受班级中的字符串并解析它们,我会在中调用代码进行验证,并在将它们传递给班级之前确保输入有效。

1

属性getter和setter方法实际上只是getXXXsetXXX方法(这是他们是如何编译)。因为你从属性本身设置属性,这是如果你在一个方法上无止境地重复出现。

public DateTime time() 
{ 
    return time(); 
} 

正如其他的答案所述,您可以使用支持字段或自动实现的属性。