Пользовательские свойства В C# вызывают исключение StackOverflowException при построении



Я писал некоторый код в движке Unity3d и обучал себя C#. Я пытался найти ответ на свой вопрос, но безуспешно. Я пришел из java и пытался использовать свойства, и я боюсь, что не очень хорошо понимаю их. Когда я попробовал что-то вроде этого:



public int Property
{
get
{
return Property;
}

set
{
Property = value;
}
}


Я получаю переполнение стека, инициализирующее объект, когда к этому свойству обращаются для назначения. Я смог исправить это, просто используя свойство по умолчанию стиль:



get;
set;


Но я не знаю, что происходит в первом случае, что вызывает исключение. Было бы замечательно, если бы кто-нибудь мог объяснить это.
511   2  

2 ответов:

Вам нужно резервное поле.

Когда вы устанавливаете это свойство, оно устанавливает себя, которое устанавливает себя, которое устанавливает себя, которое устанавливает себя, которое устанавливает себя, которое устанавливает себя ... вы поняли суть.

Либо:

private int _Property;
public int Property
{
    get
    {
        return _Property;
    }

    set
    {
        _Property = value;
    }
}

Или вот это:

public int Property
{
    get;
    set;
}

Эта последняя форма, называемая автоматическим свойством, создает для вас это резервное поле, поэтому на самом деле эти два поля будут создавать почти один и тот же код (имя резервного поля будет отличаться).


Когда вы делаете это в своей версии код:

x.Property = 10;

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

public void SetProperty(int value)
{
    SetProperty(value);
}

Этот инструмент вызовет исключение переполнения стека по той же самой причине.

Кроме того, помните, что при создании свойства, подобного этому

public class Example
{
   public String MyData{ get; set;}
}

На самом деле, когда вы его компилируете, компилятор переводит его примерно так:

public class Example
{
   private String _myData;
   public String MyData{ get {return _myData}; set { _myData = value}}
}

Comments

    Ничего не найдено.