Почему установка статического метода приводит к переполнению стека? - PullRequest
1 голос
/ 18 марта 2009

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

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

Ответы [ 5 ]

46 голосов
/ 18 марта 2009

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

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);
}

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

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

6 голосов
/ 18 марта 2009

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

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

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

5 голосов
/ 18 марта 2009

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

1 голос
/ 20 марта 2009

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

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

0 голосов
/ 18 марта 2009

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

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

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

...