2017-10-18 54 views
0

我有一個dateTime字段編輯由datetimepicker填充一些格式的罰款,我需要使用不同的格式,所以我創建了一個新的字符串屬性 並稱它。 這裏看起來如何;C#{get;設置;}爲diffirent類型的字段,stackoverflow例外

public DateTime? birthDate_{ get; set; } 
public string birthDate { 
    get { 
     return birthDate_!=null?birthDate_.Value.ToShortDateString():""; 
    } 
    set { 
     birthDate = value; 
    } 
} 

不知何故,每當試圖返回此字符串屬性( 「生日」),它拋出

「StackOverflowException」

我不知道爲什麼它大約

+4

'集合{生日=值;你的財產正在試圖將自己置於自己的制定者之中。 – David

+3

應用[大小寫約定](https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/capitalization-conventions)是一個很好的理由。 –

回答

3

這使得沒有意義:

set { birthDate = value; } 

birthDate屬性試圖在自己的setter中設置自己。因此無限遞歸。

由於這是一個計算屬性,它確實不應該二傳手:

public string birthDate 
{ 
    get 
    { 
     return birthDate_!=null ? 
      birthDate_.Value.ToShortDateString() : 
      ""; 
    } 
} 

或者,如果你想有一個二傳手,二傳手是應設置備份數據財產(birthDate_)而不是自己設置。這將涉及將傳入的value解析爲DateTime

我懷疑這裏混亂的根源來自您的屬性的命名和可視性。他們的名字看起來像私有成員變量,通常用於手動實現的屬性。但他們實際上是公共財產。堅持既定的命名約定,它確實變得更加清晰。

+0

是啊,其實我明白爲什麼它會拋出這個異常,但刪除setter使它正常工作,謝謝 – TyForHelpDude

1

正如@大衛說:你的財產正試圖在自己的設置自己。

應設置私有財產生日的二傳手:

private DateTime? _birthDate; 

public string BirthDate { get { return birthDate_!=null? 
birthDate_.Value.ToShortDateString():""; } set { _brithDate = Convert.ToDateTime(value); } } 

我格式化你的代碼相匹配的C#編碼準則