【问题标题】:StackOverflow Exception from get and set来自 get 和 set 的 StackOverflow 异常
【发布时间】:2015-10-06 18:51:35
【问题描述】:

我有以下代码:

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

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

我知道这是因为我没有正确执行我的获取和设置并进入无限循环,但我不明白为什么会发生这种情况?

【问题讨论】:

    标签: c# get set


    【解决方案1】:
    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 的值才能返回。它通过在time 上调用get 来实现,它必须检索time 的值等。

    【讨论】:

    • 支持字段,而不是支持属性。
    • 是的,谢谢@JonSkeet,想成为第一,打字太快了
    • 绝对首选#1,除非您在设置/获取属性时需要进行额外的验证或其他逻辑。
    【解决方案2】:

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

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

    当你“获取”price 时,price 的 getter 被调用,price 的 getter 被调用,price 的 getter 被调用,这...

    如果您不想弄乱支持字段,只需使用自动实现属性:

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

    其他一些观察:

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

    2. 如果您进行任何浮点数学运算,您可能需要考虑将decimal 用于像Price 这样的属性,因为double 在表示像1.1 这样的十进制数时会有些不精确。 decimal 将准确地存储数字而不会损失任何精度。

    3. 仅在 catch 块中写入控制台似乎不正确。您基本上忽略了错误(从逻辑流意义上)。我不会在类中接受字符串并解析它们,而是在调用代码中进行验证,并确保输入有效,然后再将它们传递给类。

    【讨论】:

      【解决方案3】:

      属性 getter 和 setter 实际上只是 getXXXsetXXX 方法(这就是它们的编译方式)。因为您从属性本身设置属性,所以如果您在一个方法上无休止地重复。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-25
        • 1970-01-01
        • 2012-06-21
        • 2022-10-15
        • 1970-01-01
        • 2013-07-22
        相关资源
        最近更新 更多