-2

从 API 下载数据后,我尝试使用数据。我的代码示例:

private int id;
public MainPage()
{
    InitializeComponent();
    SomeFunction();
}
public void SomeFunction()
{
    DownloadFromAPI("url to api");
    MessageBox.Show(id.ToString());  //<< Returns 0
}
public void DownloadFromAPI(DownloadStringCompletedEventArgs url)
{
    //code to retrieve data (singel id)
    id = Int16.Parse(data);
    MessageBox.Show(id.ToString());  //<< Returns the correct number, like 14
    test();
}
private void test()
{
    MessageBox.Show(id.ToString());  //<< Even Returns the correct number 14 
}

完成后如何加载id信息DownloadFromAPI("url to api");。所以我得到正确的数字(14)而不是0?

4

2 回答 2

5

我怀疑你的方法实际上是这样的:

public void DownloadFromAPI(...)
{
    int id = Int16.Parse(data);
    MessageBox.Show(id.ToString());  //<< Returns the correct number, like 14
}

那是在方法中声明一个新的局部变量,而不是为实例变量赋值。

但是,就个人而言,我通常更喜欢编写返回值的方法:

public int DownloadFromApi(...)
{
    return Int16.Parse(data);
}

当然,如果这确实是对象内的自然状态,那可能是有道理的——但通常编写只计算一个值并返回它的代码比进入突变领域更简单。

于 2012-09-20T21:22:19.480 回答
0

无论您是否将“id”保留在本地类成员中,无论哪种方式,您通常都应该让您的方法对输入进行操作并产生任何相关的输出,而无需引用其本地堆栈之外的内容。我会选择以下内容:

public MainPage() 
{ 
  InitializeComponent(); 
  SomeFunction(); 
} 

public void SomeFunction() 
{ 
    int id;
    DownloadFromAPI("url to api", out id); 
    MessageBox.Show(id.ToString());
} 

public void DownloadFromAPI(url, out int id) 
{ 
  //retrieve data...

  // set id...
  id = Int16.Parse(data); 
} 
于 2012-09-20T21:48:39.823 回答