Исключение StackOverflowException при попытке получить общий список из свойства

#c# #asp.net

#c# #asp.net

Вопрос:

Свойство в UserControl:

      public JobQuote quote
{
    get 
    {
        if (ViewState["Quote"] != null)
            return (JobQuote)ViewState["Quote"];
        else
        {
            JobQuote newQuote = new JobQuote();
            return newQuote;
        }   
    }
    set { ViewState["Quote"] = value; }
}
  

Код, выполняемый в UserControl:

 protected void button_UploadFile_Click(object sender, EventArgs e)
{
    if (FileUploader.HasFile)
    {
        try
        {
            quote.JobFileNames.Add(System.IO.Path.GetFileName(FileUploader.FileName));
        }
        catch (Exception ex)
        {
            label_UploadStatus.Text = "Upload status: The file could not be uploaded.  <br />The following error occurred: "   ex.Message;
        }
    }
}
  

Свойство из класса JobQuote.cs:

 public List<string> JobFileNames
{
    get 
    {
            return JobFileNames;
    }
    set { JobFileNames = value; }
}
  

Исключение генерируется в блоке Try, когда код пытается получить доступ к свойству JobFileNames класса JobQuote.

Ответ №1:

Получатель и установщик JobFileNames свойства ссылаются на самих себя, вызывая бесконечный цикл. Когда этот цикл исчерпывает доступное пространство стека, вы получаете StackOverflowException .

Вероятно, вам нужно какое-то резервное поле для свойства. Либо явное…

 private List<string> _jobFileNames;
public List<string> JobFileNames
{
    get { return _jobFileNames; }
    set { _jobFileNames = value; }
}
  

…или, что еще лучше, автоматически реализованный…

 public List<string> JobFileNames { get; set; }
  

Ответ №2:

Ваше JobFileNames свойство возвращается само.
Вам нужно создать резервное поле и вернуть его или использовать автоматически сгенерированное свойство.

Ответ №3:

In JobQuote.cs JobFileNames ссылается на себя.

Вы бесконечно повторяете свойство.

Вместо этого используйте автоматически реализованные свойства:

 public List<string> JobFileNames { get; set;}