Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# StackOverflowException未处理_C#_.net_Exception Handling_Stack Overflow - Fatal编程技术网

C# StackOverflowException未处理

C# StackOverflowException未处理,c#,.net,exception-handling,stack-overflow,C#,.net,Exception Handling,Stack Overflow,我的代码中有这个错误 MedCareProviderLibrary.dll中发生类型为“System.StackOverflowException”的未处理异常 下面是我的代码片段以及错误的来源。它在有错误的零件上给出一个黄色箭头 显示错误的部分以粗体显示。任何帮助都将不胜感激,谢谢 private string _TestNo; private string _TestType; private DateTime _TestDate; private string _PatientNo; pr

我的代码中有这个错误

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

所有属性获取程序都返回属性本身,而不是下划线前缀的字段名

public string TestType
{
    set { _TestType = value; }
    get { return (TestType); }
}
而不是
return\u TestType
,而是执行
return TestType
,因此属性getter不断地访问自身,导致无限递归,最终导致调用堆栈溢出

此外,返回值不一定需要括号(除非您正在计算某个复杂表达式,在本例中您不需要)

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


或者,如果您使用的是C#3.0,请按照其他人的建议进行设置。

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

public string TestNo
{
    set { _TestNo = value; }
    get {return _TestNo; }
}//End of TestNo Properties
由于您没有使用任何需要您自己实现属性的附加逻辑,因此我建议您改用自动属性:

public string TestNo {get;set;}

get
上的属性中,递归调用
get

 get {return TestNo; }
这无法终止,并且会一直调用自身,直到堆栈崩溃并抛出
StackOverflowException

应该是:

 get {return _TestNo; }
public string TestType   
{
    set 
    { 
        _TestType = value; 
    }       
    get
    {
        return _TestType ; 
    }
 }
您可以在C#3.0及更高版本上使用if,并完全避免该问题:

public string TestNo { get; set;}

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

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

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

递归调用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

返回的是属性而不是成员变量,因此会导致递归

例如:

应该是:

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

因为您正试图返回属性本身(对get方法进行隐式调用),而属性本身又试图一次又一次地返回,以此类推。。。因此会出现堆栈溢出

您的代码应该是这样的:

public DateTime TestDate
{
    set { _TestDate = value; }
    get { return _TestDate; }
}//End of TestDate Properties
或者,您可以使用自动属性:

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

+而且,二传手在接球手之前。这太奇怪了,让我很困扰。@Cody Gray:别告诉任何人,但我以前也把二传手放在第一位*狡猾的眼睛*不知道异常,但为什么设置为Smth之类的字段,但返回其他看起来很像类型的内容?这不是批评,而是建议。如果您所做的只是提供直接访问器,那么您可以将所有属性转换为自动属性,如:public String PatientNo{get;set;}并删除私有成员变量。@2607:在发布的代码中,我看不到
\u Smth
任何地方…?自动属性仅在C#3.0及更高版本中受支持。如果您使用的是较旧的版本,则必须将它们写出来。@Cody我指的是这些_TestNo、_TestType等等。C#3.0及更高版本支持自动属性。它与.NET Framework的版本无关。语义学,也许,但仍然很重要。你为什么要保留他的父母?看起来很古怪。@BoltClock-无意中,但从今以后我将努力在我的帖子中添加押韵!哈哈哦,是的!但同样适用,因为它们都受到无底递归的影响:-)