3

私はC#で次のことを試みています:

public class Reference : AuditableTable
    {
        [Range(0, 99, ErrorMessage = "{0} must be between {1} and {2}")]
        [DisplayName("Order")]
        public int Order {
                get { return Order; }
                set {
                    if ((value < 0) || (value > 99)) {
                        throw new Exception(string.Format("{0} must be between 0 and 99", value.ToString()));
                    } else {
                        Order = value;
                    }
                }
            }

読み取り時にスタックオーバーフローエラーが発生する理由を誰かが説明できますか?

4

4 に答える 4

8

あなたのプロパティはそれ自体を参照しているため、無限ループが発生します。
明らかな修正は、プライベート フィールドを使用して、プロパティを通じて公開することです。

private int order;
public int Order
{
   get
   {
      return order; //private field
   }
   set
   {
      if ((value < 0) || (value > 99)) {
               throw new Exception(string.Format("{0} must be between 0 and 99",    
                                     value.ToString()));
      } else {
          order = value; // again accessing the private field (setting this time)
      }
   }
}
于 2012-08-25T08:49:21.143 に答える
3

問題は次の行です。

get { return Order; }

これはプロパティを再帰的に呼び出しているため、スタック オーバーフローが発生します。

于 2012-08-25T08:49:48.200 に答える
1

セッターとゲッターの両方が自分自身を参照しているため、スタック オーバーフローが発生します。次のように修正します。

private int _order;

public int Order {
    get { return _order; }
    set {
        if ((value < 0) || (value > 99)) {
            throw new Exception(string.Format("{0} must be between 0 and 99", value.ToString()));
        } else {
            _order = value;
        }
    }
}
于 2012-08-25T08:51:25.633 に答える
0
int _order;
public int Order {
    get { return _order; }
    set {
        if ((value < 0) || (value > 99)) {
            throw new Exception(string.Format("{0} must be between 0 and 99", value.ToString()));
        } else {
            _order = value;
        }
    }
}
于 2012-08-25T08:51:02.217 に答える