2012-10-06 131 views
3

我想用下面的getter和setter創建一個屬性我。我曾嘗試過:C#getter/setter對

int i { 
     get{ 
      return i; 
     } 
     set { 
      if (value > 60) { 
      } else { 
       i = value; 
      } 
     } 

    } 

但是,當我嘗試此操作時遇到堆棧溢出錯誤,當我嘗試運行代碼時。我的代碼有什麼問題嗎?任何Assistane將不勝感激。

回答

4

這樣做:

private int i; // backing field 

int I 
{ 
    get 
    { 
     return i; 
    } 
    set 
    { 
     if (value > 60) { 
     } else 
     { 
      i = value; 
     } 
    } 
} 

如果你不這樣做,你的代碼將保持在循環狀態,因此StackOverflow錯誤。

5

如果你的屬性中有任何類型的邏輯,你需要一個支持字段(否則自動屬性是要走的路) - 當前你正在分配給屬性本身,它再次調用你的setter代碼(對於getter也是如此) - 導致Stackoverflow異常。

例子:

private int _i; 
public int SomeProperty 
{ 
    get{ return _i;} 
    set 
    { 
    //your logic here 
    _i = value; 
    } 
} 
2

它這樣

private int i = 0; 
public int I 
{ 
    get 
    { 
     return i; 
    } 
    set 
    { 
     if (value > 60) 
     { 
     } 
     else 
     { 
      i = value; 
     } 
    } 
} 

,並請遵循一些編碼命名,其中

  1. 物業PascalCase像myProperty的
  2. 公約
  3. 私有字段都喜歡所以LocalVariable

駱駝案例更多閱讀here

1

只需使用這段代碼:

int i; 

public int I 
{ 
    get { return i; } 
    set { if (value <= 60) i = value; } 
} 

在你的代碼的問題是,您所指定我在這指的是自身的getter/setter的身體內的物業,轉向是循環的效果,並最終出現StackOverflow錯誤。

1
int i { 
    get{ 
     return i; 
    } 
    set { 
     ... 
     i = value; 
     ... 
    } 
} 

在上面的代碼,您使用的是相同的屬性名稱裏面get和set塊。

編譯之後,你的代碼將被轉換爲相當於一些事情是:

int get_i() 
{ 
return get_i(); 
} 

void set_i(int value) 
{ 
set_i(value); 
} 

正如你可以看到他們每個人都會無限調用本身(遞歸)沒有任何退出條件,從而爲StackOverflow例外。

如果你有一個支持字段的財產,怎麼樣等回答這個問題建議,編譯器會生成一些東西等同於這一點,它沒有遞歸:

int get_i() 
{ 
return _i; //_i is the backing field 
} 

void set_i(int value) 
{ 
_i = value; 
} 

UPDATE:

爲了完整起見,我在這裏添加一種方法來解決您的問題。

int _i; 
int i { 
    get{ 
     return _i; 
    } 
    set { 
     if (value > 60) { 
     } else { 
      _i = value; 
     } 
    } 
}