2013-04-07 4 views
-7

Я создал класс и глобальную переменную, названную как номер телефона. Эта переменная устанавливается в методе и используется в другом методе. Однако эта переменная возвращает значение null. Все методы и эта глобальная переменная в одном классе. Пожалуйста, помогите понять эту проблему. Большое спасибо. Мой класс:Почему переменная экземпляра возвращает null в C#?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Net; 
using System.IO; 
using System.Net.Http; 
using Newtonsoft.Json; 
using System.Collections; 
namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private string telephoneNumber; 
     private async void GetSingleLocationInfo(string href) 
     { 

      var hereNetUrl = string.Format(
       href+"&accept=application/json" 
        ); 

      // get data from HERE.net REST API 
      var httpClient = new HttpClient(); 
      var hereNetResponse = await httpClient.GetStringAsync(hereNetUrl); 

      // deseralize JSON from Here.net 
      using (var tr = new StringReader(hereNetResponse)) 
      using (var jr = new JsonTextReader(tr)) 
      { 
       var rootObjectResponse = new JsonSerializer().Deserialize<Object>(jr); 

       String contacts = rootObjectResponse.ToString(); 
       int startIndex = contacts.IndexOf("phone"); 
       if (startIndex != -1) 
       { 
        String value = contacts.Substring(startIndex, 50); 
        telephoneNumber=value.Substring(value.IndexOf("+")); 
       } 
       else 
       { 
        telephoneNumber=""; 
       } 

      } 
     } 
     private async void GeocodingWin8Query() 
     { 
      // build URL for Here.net REST service 
      string currentgeoLoc = "37.75075,-122.393472"; 
      string queryString = "taxi"; 
      string appID = "dV04O71v5F3f2W"; // MAKE SURE TO GET YOUR OWN from developers.here.net 
      object appCode = "8QVr5uSXwfcowDrA"; // MAKE SURE TO GET YOUR OWN from developers.here.net 
      var hereNetUrl = string.Format(
       "http://demo.places.nlp.nokia.com/places/v1/discover/search?at={0}&q={1}&app_id={2}&app_code={3}&accept=application/json", 
        currentgeoLoc, queryString, appID, appCode); 

      // get data from HERE.net REST API 
      var httpClient = new HttpClient(); 
      var hereNetResponse = await httpClient.GetStringAsync(hereNetUrl); 

      // deseralize JSON from Here.net 
      using (var tr = new StringReader(hereNetResponse)) 
      using (var jr = new JsonTextReader(tr)) 
      { 
       var rootObjectResponse = new JsonSerializer().Deserialize<RootObject>(jr); 


       List<Item> items=rootObjectResponse.results.items; 


       foreach(Item item in items){ 
        string href = item.href; 
        GetSingleLocationInfo(href); 
        Console.WriteLine (telephoneNumber);//returns null 
       } 


      } 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      GeocodingWin8Query(); 
     } 
    } 
    public class Category 
    { 
     public string id { get; set; } 
     public string title { get; set; } 
     public string href { get; set; } 
     public string type { get; set; } 
    } 

    public class Item 
    { 
     public List<double> position { get; set; } 
     public int distance { get; set; } 
     public string title { get; set; } 
     public Category category { get; set; } 
     public string icon { get; set; } 
     public string vicinity { get; set; } 
     public List<object> having { get; set; } 
     public string type { get; set; } 
     public string href { get; set; } 
     public string id { get; set; } 
     public double? averageRating { get; set; } 
    } 


    public class Context 
    { 
     public Location location { get; set; } 
     public string type { get; set; } 
    } 

    public class Search 
    { 
     public Context context { get; set; } 
    } 

    public class RootObject 
    { 
     public Results results { get; set; } 
     public Search search { get; set; } 
    } 
} 
+3

Где он возвращает null? Что вы уже пробовали? Что именно вы пытаетесь достичь? – Clint

+0

Комментарий Клинта прикомандировано - вы действительно попытались отладить любой из этого кода, чтобы узнать, где установлен номер телефона? –

+0

положить точку останова, где переменной присвоено значение. Убедитесь, что он не получает нулевое значение. – ankurtr

ответ

3

Итак, когда вы вызываете GetSingleLocationInfo, вы вызываете метод async. Таким образом, getSingleLocationInfo calwill работает до выражения ожидания, а затем возвращает stright вызывающему, до httpClient.GetStringAsync (hereNetUrl); вернулся.

Чтобы исправить это, вам нужно дождаться своего вызова GetSingleLocationInfo, прежде чем пытаться получить доступ к переменной.

+0

Вы правы. Проблема в том, что я не использую ожидание. Спасибо – olyanren

0

String.Substring возвращает NULL, когда ни одна строка не найдена.

0

Это будет «возврат» нулевого значения, потому что telephoneNumber еще не был установлен.

Ваше объявление переменной private string telephoneNumber; не устанавливает никаких значений, поэтому это пустая строка или нуль.

Мое предположение будет вашим методом, когда вы распечатываете его, вызывается перед методом, в котором вы действительно установили telephoneNumber, чтобы иметь значение.

+0

Нет, вы ошибаетесь, потому что я установил номер телефона в методе GetSingleLocationInfo – olyanren

+1

@mucayufa, который может быть, но поскольку Джастин Харви указал, что это асинхронный метод, поэтому вы оставили себя в состоянии гонки. Это может помочь: http://stackoverflow.com/questions/34510/what-is-a-race-condition – Clint

1

Поскольку GetSingleLocationInfo является асинхронной она будет называться асинхронно, так что еЫп (telephoneNumber); будет вызываться до GetSingleLocationInfo изменить его. Я думаю, вы должны поместить , ожидая при вызове метода.

Смежные вопросы