Исключение переполнения стека в установщике c #

И добавить несколько файлов библиотеки, которые вы можете записать, как показано ниже:

INCLUDEPATH * = E: / DebugLibrary / VTK E: / DebugLibrary / VTK / Common E: / DebugLibrary / VTK / Фильтрация E: / DebugLibrary / VTK / GenericFiltering E: / DebugLibrary / VTK / Graphics E: / DebugLibrary / VTK / GUISupport / Qt E: / DebugLibrary / VTK / Hybrid E: / DebugLibrary / VTK / Imaging E: / DebugLibrary / VTK / IO E: / DebugLibrary / VTK / Parallel E: / DebugLibrary / VTK / Rendering E: / DebugLibrary / VTK / Утилиты E: / DebugLibrary / VTK / VolumeRendering E: / DebugLibrary / VTK / Widgets E: / DebugLibrary / VTK / Wrapping

LIBS * = -LE: / DebugLibrary / VTKBin / bin / release -lvtkCommon -lvtksys -lQVTK -lvtkWidgets -lvtkRendering -lvtkGraphics -lvtkImaging -lvtkIO -lvtkFiltering -lvtkDICOMParser -lvtkpng -lvtktiff -lvtkzlib -lvtkjpeg -lvtkzpat - lvtkNetCDF -lvtkexoIIc -lvtkftgl -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTKWidgetPlugin -lvtkGenericFiltering

13
задан Jonathan Wakely 2 January 2013 в 19:20
поделиться

4 ответа

Когда вы пишете a = value , вы снова вызываете установщик свойств.

Чтобы использовать неавтоматические свойства, необходимо создать отдельное закрытое резервное поле, например:

ConstraintSet a;
public ConstraintSet A { get { return a; } set { a = value; } }
37
ответ дан 1 December 2019 в 05:58
поделиться

Вы не объявили поддерживающую переменную - у вас есть свойство, геттеры и сеттеры которого вызывают сами себя. Мне не ясно , почему первая форма не поддерживается Unity - это означает, что, возможно, эквивалент также не будет поддерживаться, но в основном это:

private ConstraintSet aValue;
public ConstraintSet a { get { return aValue; } set { aValue = value; } }

Обычно у меня более традиционное имя, конечно - что означает, что вы можете обойтись без бита «value»:

private ConstraintSet constraints;
public ConstraintSet Constraints
{
    get { return constraints; } 
    set { constraints = value; }
}

Чтобы подробнее объяснить, почему ваша текущая вторая форма генерирует исключение StackOverflowException , вы всегда должны помните, что свойства - это в основном замаскированные методы. Ваш сломанный код выглядит следующим образом:

public ConstraintSet get_a()
{
    return get_a();
}

public void set_a(ConstraintSet value)
{
    set_a(value);
}

Надеюсь, очевидно, почему эта версия взрывает стек. Измененная версия просто устанавливает переменную вместо повторного вызова свойства, поэтому это выглядит так, когда расширен:

private ConstraintSet aValue;

public ConstraintSet get_a()
{
    return aValue;
}

public void set_a(ConstraintSet value)
{
    aValue = value;
}
18
ответ дан 1 December 2019 в 05:58
поделиться

Вам нужна частная резервная переменная в вашем общедоступном свойстве:

private ConstraintSet _a;
public ConstraintSet a { get { return _a; } set { _a = value; } }
3
ответ дан 1 December 2019 в 05:58
поделиться

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

private ConstraintSet _a;
public ConstraintSet a { get { return _a; } set { _a = value; } }
4
ответ дан 1 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: