0

我有 3 个功能:

public int ok_join(string gr)
{

        ...................
        string gash = Regex.Match(response, @"gash:""(?<id>[^""]+)""").Groups["id"].Value;
        string groupId = Regex.Match(response, @"state:""smd=(?<id>[^""]+)""").Groups["id"].Value;
       ......................
}

public bool ok_post(string gr)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.site.ru/" + gash + "&stoud=" + groupId + "&");
    .........................
 }

public void go()
{
    while (true)
    {
        ........

                int h = ok_join(gr);
                if (h == 0)
                    ok_post(gr);
        .............
     }
}

如何将函数 ok_join 的 gash 和 groupid 值发送到 ok_post?

4

4 回答 4

4

全力以赴:ok_join返回一个包含您的返回值的完整对象int(无论h应该代表什么,我猜它是通过/失败?),gash然后groupId将其传递到ok_join

public class JoinResults
{
    public int h { get; private set; }
    public string gash { get; private set; }
    public string groupId { get; private set; }

    public JoinResults(int h, string gash, string groupId)
    {
        this.h = h;
        this.gash = gash;
        this.groupId = groupId;
    }
}

然后您的方法/用法如下所示:

public JoinResults ok_join(string gr)
{
        string gash = Regex.Match(response, @"gash:""(?<id>[^""]+)""").Groups["id"].Value;
        string groupId = Regex.Match(response, @"state:""smd=(?<id>[^""]+)""").Groups["id"].Value;

        return new JoinResults(0, gash, groupId);
}

public bool ok_post(JoinResults joinResults, string gr)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.site.ru/" + joinResults.gash + "&stoud=" + joinResults.groupId + "&");
}

public void go()
{
    while (true)
    {
        JoinResults results = ok_join(gr);
        if (results.h == 0)
            ok_post(results, gr);
     }
}

尽管我强烈建议您在成员名称、大小写等方面以及该gr变量应该是什么方面进行可读性通行证。

于 2012-12-03T20:17:06.483 回答
2

你可以使用 out 参数

public int ok_join(string gr, out string gash, out string groupId) 
{
        ...................
        gash = Regex.Match(response, @"gash:""(?<id>[^""]+)""").Groups["id"].Value;
        groupId = Regex.Match(response, @"state:""smd=(?<id>[^""]+)""").Groups["id"].Value;
       ......................  
}

public bool ok_post(string gr, string gash, string groupId) 
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.site.ru/" + gash + "&stoud=" + groupId + "&");
    .........................  
}

public void go() 
{
    while (true)
    {
        ........
                string gash;
                string groupId

                int h = ok_join(gr, out gash, out groupId);
                if (h == 0)
                    ok_post(gr, gash, groupId);
        .............
     } 
}
于 2012-12-03T20:07:28.683 回答
0

这里有两条真正的路径:

  1. 这两个变量代表包含这两种方法的对象的“状态”。我们很难知道您是否属于这种情况,因为我们不知道对象是什么,这些变量可能在哪里使用,它们何时过时等等。如果这些变量应该存在于大多数情况下,如果不是全部,那么在它们所在的对象的生命周期中,它们很可能是该对象“状态”的一部分。如果这对您来说是正确的,那么您应该为包含这两种方法的类创建两个私有实例变量,将它们都设置在中ok_join,然后将它们读入ok_post.
  2. 这两个变量不代表该对象状态的一部分;您只是想在紧随其后调用的另一个函数中使用某个函数的结果;数据不应超过这两个函数调用。在这种情况下,您希望从第一个函数返回这两个值,并将它们传递给下一个函数。

对于选项#2,有几种方法可以在实践中实际实现它。您遇到的最大障碍是 C#(和大多数编程语言)中的方法只能return有一个值,而不是多个值。解决这个问题的一种方法是使用out参数,正如juharr 对您的问题另一个答案所示。另一种选择是创建自己的自定义类型,将函数需要返回的所有内容放入该类型,然后将该类型传递给第二个函数。可以这样实现:

public class JoinResults
{
    public int H { get; set; }
    public string Gash { get; set; }
    public string GroupId { get; set; }
}

然后你可以调整你的方法看起来像:

public JoinResults ok_join(string gr)
{
    string gash = "";
    string groupID = "";
    //...
    return new JoinResults()
    {
        H = 0,
        Gash = gash,
        GroupId = groupID,
    };
}

public bool ok_post(string gr, JoinResults joinResults)
{
    string url = "http://www.site.ru/" + joinResults.Gash + "&stoud="
        + joinResults.GroupId + "&";
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    //.........................
    return true;
}

然后调用代码将如下所示:

JoinResults results = ok_join(gr);
if (results.H == 0)
    ok_post(gr, results);
于 2012-12-03T20:24:23.293 回答
-2

为什么不使用 delcaregashgroupidas 全局变量?

于 2012-12-03T20:05:36.957 回答