Исключение StackOverflowException было обработано - PullRequest
5 голосов
/ 15 апреля 2011

У меня есть эта ошибка в моем коде

Произошло необработанное исключение типа 'System.StackOverflowException' в MedCareProviderLibrary.dll

Вот фрагмент кодамой код и откуда исходит ошибка.Это дает желтую стрелку на детали с ошибкой.

Часть, показывающая ошибку, выделена жирным шрифтом.Любая помощь будет высоко ценится Спасибо

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 ]

18 голосов
/ 15 апреля 2011

Все ваши получатели свойств возвращают сами свойства вместо имен полей с префиксом подчеркивания.

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

Вместо return _TestType вы делаете return TestType, поэтому средство получения свойств продолжает обращаться к себе снова и снова, что приводит к бесконечной рекурсии и в конечном итоге к переполнению стека вызовов.

Кроме того, возвращаемые значения не обязательно должны заключаться в квадратные скобки (если только вы не вычисляете какое-то сложное выражение, а в данном случае - нет).

Измените ваши методы получения, чтобы вместо них возвращались поля с префиксом подчеркивания (сделайте это для всех ваших свойств):

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

Или задайте им автоматические свойства , как другие советуют, если вы используете C # 3.0.

6 голосов
/ 15 апреля 2011

В ваших свойствах на get вы вызываете get рекурсивно:

 get {return TestNo; }

Это не имеет способа завершиться и продолжает вызывать себя до тех пор, пока стек не взорвется и StackOverflowException не получитброшено.

Это должно быть:

 get {return _TestNo; }

Вы можете использовать Автоматические свойства , если на C # 3.0 и выше, и избежать проблемы в целом:

public string TestNo { get; set;}

Это, конечно, относится ко всем другим имеющимся у вас свойствам

5 голосов
/ 15 апреля 2011

Вы должны вернуть поле поддержки вместо самого свойства в реализации вашего свойства, иначе свойство будет вызывать себя рекурсивно и вызывать переполнение стека:

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

Поскольку вы не используете никакой дополнительной логикиэто потребовало бы от вас реализации ваших свойств, я бы рекомендовал вместо этого использовать авто свойства:

public string TestNo {get;set;}
1 голос
/ 15 апреля 2011

потому что вы пытаетесь вернуть само свойство (которое делает неявный вызов метода get), которое, в свою очередь, пытается возвращаться снова и снова, снова и так далее ... так что вы получаете переполнение стека.

Ваш код должен быть таким:

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

в качестве альтернативы вы можете использовать авто-свойства:

public DateTime TestDate
{
    set; get;
}//End of TestDate Properties
1 голос
/ 15 апреля 2011

Вы возвращаете свойство, а не переменную-член, вызывая рекурсию.

например:

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

должно быть:

public string TestType   
{
    set 
    { 
        _TestType = value; 
    }       
    get
    {
        return _TestType ; 
    }
 }
1 голос
/ 15 апреля 2011

Вы рекурсивно вызываете функцию 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
0 голосов
/ 15 апреля 2011

Ваши свойства возвращают себя, а не переменную-член, что приводит к взрыву стека. Вероятно, вы хотели написать:

public string TestType
{
    set { _TestType = value; }
    get { return _TestType; }
}//End of TestType Properties
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...