StackOverflowException未处理

时间:2011-04-15 12:03:52

标签: c# .net exception-handling stack-overflow

我的代码中出现此错误

  

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); }
}

7 个答案:

答案 0 :(得分:18)

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

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

而不是return _TestType,你执行return TestType,因此属性getter会一次又一次地访问自身,导致无限递归并最终导致调用堆栈溢出。

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

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

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

如果您使用的是C#3.0,或者像其他人一样建议automatic properties

答案 1 :(得分:6)

在您get的属性中,您正在递归地调用get

 get {return TestNo; }

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

应该是:

 get {return _TestNo; }

如果在C#3.0及更高版本上,您可以使用Automatic properties,并完全避免此问题:

public string TestNo { get; set;}

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

答案 2 :(得分:5)

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

public string TestNo
{
    set { _TestNo = value; }
    get {return _TestNo; }
}//End of TestNo Properties

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

public string TestNo {get;set;}

答案 3 :(得分:1)

您递归调用get函数,并且不引用要返回的对象。它应该是这样的:

public string TestNo
{
    set { _TestNo = value; }
    get {return _TestNo; }
}//End of TestNo Properties

public string TestType
{
    set { _TestType = value; }
    **get { return _TestType; }**
}//End of TestType Properties

public DateTime TestDate
{
    set { _TestDate = value; }
    get { return _TestDate; }
}//End of TestDate Properties

public string PatientNo
{
    set { _PatientNo = value; }
    get { return _PatientNo; }
}//End of PatientNo Properties

public string DoctorNo
{
    set { _DoctorNo= value; }
    get { return _DoctorNo; }
}//End of DoctorNo Properties

答案 4 :(得分:1)

您正在返回属性而不是成员变量,从而导致递归。

例如:

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

应该是:

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

答案 5 :(得分:1)

因为你试图返回属性本身(这会对get方法进行隐式调用),而后者又会一次又一次地尝试返回等等......所以你得到堆栈溢出。

你的代码应该是这样的:

public DateTime TestDate
{
    set { _TestDate = value; }
    get { return _TestDate; }
}//End of TestDate Properties

或者你可以使用自动属性:

public DateTime TestDate
{
    set; get;
}//End of TestDate Properties

答案 6 :(得分:0)

您的属性自行返回,而不是您的成员变量,导致堆栈爆炸。你可能想写的是:

public string TestType
{
    set { _TestType = value; }
    get { return _TestType; }
}//End of TestType Properties