StackOverflowException未处理

mys*_*tic 5 .net c# stack-overflow exception-handling

我的代码中出现此错误

MedCareProviderLibrary.dll中发生未处理的"System.StackOverflowException"类型异常

这是我的代码片段以及错误的来源.它在带有错误的零件上给出了一个黄色箭头.

显示错误的部分以粗体显示.任何帮助将不胜感激谢谢

private string _TestNo;
private string _TestType;
private DateTime _TestDate;
private string _PatientNo;
private string _DoctorNo;

public Test()
{
    _TestNo = "";
    _TestType = "";
    _TestDate = new DateTime();
    _PatientNo = "";
    _DoctorNo = "";
}

public Test(string aTestNo, string aTestType, DateTime aTestDate, string aPatientNo, string aDoctorNo)
{
    _TestNo = aTestNo;
    _TestType = aTestType;
    _PatientNo = aPatientNo;
    _DoctorNo = aDoctorNo;
}

public string TestNo
{
    set { _TestNo = value; }
    get { return (TestNo); }
}    

public string TestType
{
    set { _TestType = value; }
    **get { return (TestType); }
}

public DateTime TestDate
{
    set { _TestDate = value; }
    get { return (TestDate); }
}

public string PatientNo
{
    set { _PatientNo = value; }
    get { return (PatientNo); }
}

public string DoctorNo
{
    set { _DoctorNo= value; }
    get { return (DoctorNo); }
}
Run Code Online (Sandbox Code Playgroud)

Bol*_*ock 18

所有属性getter都返回属性本身而不是下划线前缀字段名称.

public string TestType
{
    set { _TestType = value; }
    get { return (TestType); }
}
Run Code Online (Sandbox Code Playgroud)

而不是return _TestType,你这样做return TestType,所以属性getter一次又一次地访问自己,导致无限递归并最终溢出调用堆栈.

此外,返回值不一定需要括号(除非您正在评估一些复杂的表达式,在这种情况下,您不是这样).

更改您的getter以返回以下划线为前缀的字段(对所有属性执行此操作):

public string TestType
{
    set { _TestType = value; }
    get { return _TestType; }
}
Run Code Online (Sandbox Code Playgroud)

或者如果您使用的是C#3.0,则可以像其他人一样建议自动属性.

  • +1此外,设置者在*getters之前是*.这完全是奇怪的,而且困扰着我. (4认同)

Ode*_*ded 6

在您的属性中,您getget递归方式调用:

 get {return TestNo; }
Run Code Online (Sandbox Code Playgroud)

这无法终止并继续调用自己,直到堆栈被烧毁StackOverflowException并被抛出.

它应该是:

 get {return _TestNo; }
Run Code Online (Sandbox Code Playgroud)

您可以在C#3.0及更高版本上使用自动属性,并完全避免此问题:

public string TestNo { get; set;}
Run Code Online (Sandbox Code Playgroud)

这当然适用于您拥有的所有其他属性

  • **C#**3.0及以上版本支持自动属性.它与.NET Framework的版本无关.语义学,也许,但仍然很重要. (2认同)

Bro*_*ass 5

您必须在属性实现中返回支持字段而不是属性本身,否则该属性将递归调用自身并导致堆栈溢出:

public string TestNo
{
    set { _TestNo = value; }
    get {return _TestNo; }
}//End of TestNo Properties
Run Code Online (Sandbox Code Playgroud)

由于您没有使用任何需要您自己实现属性的其他逻辑,我建议您使用自动属性:

public string TestNo {get;set;}
Run Code Online (Sandbox Code Playgroud)