Почему я получаю переполнение стека при использовании свойств в конструкторе? - PullRequest
2 голосов
/ 27 ноября 2009

У меня есть нестатический класс, в котором у меня есть несколько свойств, то есть serverURL, serverPort и т. Д., И у класса есть конструктор. Конструктор принимает аргументы, которые он затем использует для «установки» свойств, инициализируя их. Вот код:

public Server(string newServerAddress, int newServerPort) {

        serverAddress = newServerAddress;
        serverPort = newServerPort;
}

public string serverAddress {
    get {
        return serverAddress;
    }
    set {
        serverAddress = value;
    }
}
public int serverPort {
    get {
        return serverPort;
    }
    set {
        serverPort = value;
    }

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

Server test = new Server("server.url.here",8080);

Этот код явно связан с классом, но я оставил его здесь. Это любительская проблема, и я делал подобные вещи раньше, но я совершенно сбит с толку тем, что происходит, и когда я пытаюсь отладить его в Visual Studio, он говорит мне, что он не может отладить его, предположительно поскольку он использует стек для отладки.

Ответы [ 4 ]

5 голосов
/ 27 ноября 2009

Соблюдайте чувствительность к регистру. Собственность возвращается сама.

public string serverAddress {
    get {
        return serverAddress; // recursing here
    }
}
3 голосов
/ 27 ноября 2009

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

private string mServerAddress;
public string serverAddress {
    get {
        return mServerAddress;
    }
    set {
        mServerAddress = value;
    }
}

Или используйте автоматический синтаксис свойства:

public string ServerAddress { get; set; }
1 голос
/ 27 ноября 2009

Вы ссылаетесь на сеттер внутри сеттера ...

внутри вашего сервера свойств адреса, у вас есть строка:

serverAddress = value

, который собирается перейти к установщику для свойства serverAddress и зацикливаться ...

используйте следующий синтаксис:

private string _serverPort;
public string ServerPort
{
 get { return _serverPort; }
 set { _serverPort = value; }
}

Надеюсь, это поможет:)

1 голос
/ 27 ноября 2009

У вас есть рекурсия в установщике или получателе свойств. Попробуйте этот код вместо:

public Server(string newServerAddress, int newServerPort) {    
        serverAddress = newServerAddress;
        serverPort = newServerPort;
}

public string serverAddress { get; set; }
public int serverPort { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...