2009-03-17 2 views
1

Почему я получаю ошибку переполнения стека, если я использую аксессуар набора для изменения статического члена класса в C#?Почему установка статического метода приводит к переполнению стека?

Я не оспариваю это как ошибку, я просто хочу знать, что именно происходит внутри внутренних частей машины.

+1

Не могли бы вы привести пример? –

+3

У вас есть StackOverflowException и сразу же отправился на StackOverflow.com. Теперь это развлечение, как вы не можете заплатить. – bzlm

+6

Интересно, сколько человек заходит на сайт www.argumentexception.com и разочарованы, чтобы не найти никакой помощи. –

ответ

46

Не следует; Я ожидаю, что у вас есть что-то вроде:

private static int foo; 
public static int Foo { 
    get {return foo;} 
    set {Foo = value;} // spot the typo!!! (should be foo) 
} 

По существу, set является:

static void set_Foo(int value) { 
    set_Foo(value); 
} 

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

Невозможно диагностировать больше без образца кода.

+0

+1 переполнение стека, как правило, проблемы с рекурсией –

+1

Не то, чтобы я когда-либо делал что-либо подобное. , , * cough * –

+0

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

5

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

0

Вы хотите знать, что происходит внутри, чтобы вызвать переполнение стека?

Ваш метод вызывает другой метод, который приводит к бесконечной рекурсии: вызовы A, переполнение стека. A вызывает B, затем B вызывает A, переполнение стека. И так далее.

Как предположил Марк Гравелл, это, скорее всего, ошибка в реализации вашей собственности.

6

Я предполагаю, что вы делаете что-то вроде этого:

public class MyClass 
{ 
    public int TheInt 
    { 
    get 
    { 
     return TheInt; 
    } 
    set 
    { 
     TheInt = value; // assignment = recursion! 
    } 
} 

Проблема заключается в том, в функции множества для TheInt, вы присвоить значение TheInt, которое приведет к вложенному вызову функция набора. Вы получаете рекурсию, а затем переполнение стека.

+0

Итак ... как вы это решаете? –

1

Я думаю, что вижу другую интерпретацию вопроса. Если вопрос не в том, почему происходит переполнение, но почему аксессоры могут вызвать переполнение. В этом случае аксессор - это вызов функции, как и любой другой, и поэтому он потребляет пространство стека.

Если вы используете публичных пользователей без доступа к ним, MyClass.myint не станет вызовом функции и не может переполнять стек.

Смежные вопросы