Переменная Область в C # - PullRequest
       13

Переменная Область в C #

2 голосов
/ 02 ноября 2009

Моя программа веб-службы должна генерировать случайный код и возвращать его клиентской программе. Прямо сейчас он возвращает «» как код вместо случайно сгенерированного кода. Что не так с моими переменными областями? Спасибо.

public class Service1 : System.Web.Services.WebService
{
    private string code = "";

    [WebMethod]
    public void StartGame()
    {
        // Pick a secret code
        // R, B, G, O, T, W, P, Y
        Random random = new Random();
        for (int i = 0; i < 4; i++)
        {
            int num = random.Next(8) + 1;
            if (num == 1)
                this.code += "R";
            else if (num == 2)
                this.code += "B";
            else if (num == 3)
                this.code += "G";
            else if (num == 4)
                this.code += "O";
            else if (num == 5)
                this.code += "T";
            else if (num == 6)
                this.code += "W";
            else if (num == 7)
                code += "P";
            else if (num == 8)
                this.code += "Y";
        }
    }

    [WebMethod]
    public string MakeGuess(string guess)
    {
        return this.code;
    }
}

Ответы [ 4 ]

12 голосов
/ 02 ноября 2009

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

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

Представлено без дополнительного комментария:

public static string GenerateRandomCode(int length)
{
    const string charset = "RBGOTWPY";

    string randomCode = "";
    Random random = new Random();

    while (length > 0)
    {
        length--;
        randomCode += charset[random.Next(charset.Length)];
    }
    return randomCode;
}
1 голос
/ 02 ноября 2009

Вы делаете два разных звонка, один, чтобы вызвать стартовую игру, а другой, чтобы вызвать MakeGuess? отдельные вызовы подразумевают создание разных объектов на стороне сервера. Вы должны создать сеансы или сделать код var статическим.

0 голосов
/ 02 ноября 2009

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

`

[WebMethod]
    public string MakeGuess(string guess)
    {
        private string code = "";
        // Pick a secret code
        // R, B, G, O, T, W, P, Y
        Random random = new Random();
        for (int i = 0; i < 4; i++)
        {
            int num = random.Next(8) + 1;
            if (num == 1)
                this.code += "R";
            else if (num == 2)
                this.code += "B";
            else if (num == 3)
                this.code += "G";
            else if (num == 4)
                this.code += "O";
            else if (num == 5)
                this.code += "T";
            else if (num == 6)
                this.code += "W";
            else if (num == 7)
                code += "P";
            else if (num == 8)
                this.code += "Y";
        }
        return code;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...