C#{get; set;}表示不同类型的字段,stackoverflow异常

时间:2017-10-18 11:48:44

标签: .net asp.net-mvc

我有一个dateTime字段,由datetimepicker编辑填充,格式很好,我需要使用不同的格式,所以我创建了一个新的字符串属性 并称之为。 在这里看起来如何;

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

不知怎的,只要尝试返回此字符串属性(" birthDate"),它就会抛出

  

" StackOverflowException"

2 个答案:

答案 0 :(得分:3)

这没有任何意义:

set { birthDate = value; }

birthDate属性正试图将自己设置在自己的setter中。因此无限递归。

由于这是一个计算属性,它真的不应该拥有一个setter:

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

或者,如果你想要它有一个setter,那个setter应该设置后备数据属性(birthDate_)而不是设置它自己。这将涉及将传入的value解析为DateTime

我怀疑这里混淆的根源来自于你的属性的命名和可见性。它们的名称看起来像私有成员变量,通常用于手动实现的属性。但它们实际上是公共财产。坚持既定的命名惯例,它确实变得更加清晰。

答案 1 :(得分:1)

正如@David所说:你的财产正试图将自己置于自己的制定者中。

您应该在birthDate:

的setter中设置私有属性
private DateTime? _birthDate;

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

我已将您的代码格式化为与C#编码指南相匹配