Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的变量作用域#_C#_Variables_Scope - Fatal编程技术网

C# C语言中的变量作用域#

C# C语言中的变量作用域#,c#,variables,scope,C#,Variables,Scope,我的web服务程序应该生成一个随机代码并将其返回给客户端程序。现在它返回“”作为代码,而不是随机生成的代码。我的变量作用域有什么问题?谢谢 public class Service1 : System.Web.Services.WebService { private string code = ""; [WebMethod] public void StartGame() { // Pick a secret code // R

我的web服务程序应该生成一个随机代码并将其返回给客户端程序。现在它返回“”作为代码,而不是随机生成的代码。我的变量作用域有什么问题?谢谢

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;
    }
}
公共类服务1:System.Web.Services.WebService
{
私有字符串代码=”;
[网络方法]
公共无效StartName()
{
//选择密码
//R,B,G,O,T,W,P,Y
随机=新随机();
对于(int i=0;i<4;i++)
{
int num=random.Next(8)+1;
如果(num==1)
此代码+=“R”;
else if(num==2)
此代码+=“B”;
else if(num==3)
此代码+=“G”;
else if(num==4)
此代码为“+=”O”;
else if(num==5)
此代码+=“T”;
else if(num==6)
此代码+=“W”;
else if(num==7)
代码+=“P”;
else if(num==8)
此代码为“+=”Y”;
}
}
[网络方法]
公共字符串MakeGuess(字符串猜测)
{
返回此.code;
}
}

问题是这些方法在类的两个单独实例上被调用。当HTTP请求传入时,每个方法在类的新实例上调用一次,然后该类将被丢弃。由于HTTP协议的无状态性质,服务器不知道这些请求在某种程度上是相关的

您是否正在进行两个不同的调用,一个调用开始游戏,另一个调用MakeGuess?单独的调用意味着在服务器端创建不同的对象。您应该创建会话或使代码变为静态。

如果不需要两个调用,为什么不创建一个简单的方法

`

[WebMethod]
公共字符串MakeGuess(字符串猜测)
{
私有字符串代码=”;
//选择密码
//R,B,G,O,T,W,P,Y
随机=新随机();
对于(int i=0;i<4;i++)
{
int num=random.Next(8)+1;
如果(num==1)
此代码+=“R”;
else if(num==2)
此代码+=“B”;
else if(num==3)
此代码+=“G”;
else if(num==4)
此代码为“+=”O”;
else if(num==5)
此代码+=“T”;
else if(num==6)
此代码+=“W”;
else if(num==7)
代码+=“P”;
else if(num==8)
此代码为“+=”Y”;
}
返回码;
}

在没有附加注释的情况下呈现:

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

嗨,使变量“code”静态工作。你能解释一下为什么这样我才能更好地理解吗?另外,我该如何进行一次会议?如果你能给我指一些参考资料,我将不胜感激!感谢您将代码用作类的变量。这意味着它将与您的类实例的寿命一样长。当您在服务器端调用WebMethod时,会创建类的实例来执行您的方法。您正在使用方法“StartGame”和“code”变量来获得所需的结果,但当方法执行结束时,您的对象将被销毁。调用第二个方法会创建一个新实例来执行MakeGuess,现在'code'变量为空,因为它是新的。通过将此代码设置为静态,无论您的类的不同实例是否被创建,它都是有效的。静态解决了您的问题,但不是更优雅,如果您调用两次Web服务,您将看到代码将一个接一个地产生两个结果,您需要在每次调用StartName时重置它。考虑使用本地变量和单个函数调用(如这里的一些其他解决方案所建议的),或者您可以浏览ASP.NET参考书目并熟悉会话,仅仅通过Google实现会话来实现.NET Web服务将带来一些交互式文章来阅读。我相信我理解您所说的。就像jmayor建议的那样,我应该使用会话。我还想问你,你是否知道关于会话的任何好的参考资料。非常感谢。卢:在MSDN上查一下。此外,您还可以通过要求客户端在调用方法时传递ID来管理状态(并提供一个方法来发布客户端ID)。感谢您的帮助,但我更愿意将我的方法分解为更小的步骤,因为我计划稍后添加更多步骤。:)非常感谢。我在自言自语。
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;
}