-7

クラスと、telephoneNumber という名前のグローバル変数を作成しました。この変数はメソッドで設定され、別のメソッドで使用されます。ただし、この変数は null を返します。同じクラス内のすべてのメソッドとこのグローバル変数。この問題を理解するのを手伝ってください。どうもありがとう。私のクラスは:

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

4 に答える 4

3

したがって、GetSingleLocationInfo を呼び出す場合は、非同期メソッドを呼び出しています。したがって、GetSingleLocationInfo 呼び出しは、await ステートメントまで実行され、呼び出し元にすぐに戻ります。帰りました。

これを修正するには、変数にアクセスする前に GetSingleLocationInfo の呼び出しを待機する必要があります。

于 2013-04-07T15:24:20.480 に答える
1

GetSingleLocationInfoは非同期であるため、非同期で呼び出されるため、Console.WriteLine (telephoneNumber); GetSingleLocationInfoがそれを変更する前に呼び出されます。メソッドを呼び出すときにawaitを入れる必要があると思います。

于 2013-04-07T15:26:17.467 に答える
0

telephoneNumberまだ設定されていないため、単純に null を「返す」ことになります。

変数の宣言ではprivate string telephoneNumber;値が設定されていないため、空の文字列または null です。

telephoneNumber私の推測では、実際に値を持つように設定したメソッドの前に、それを印刷するメソッドが呼び出されていると思います。

于 2013-04-07T15:24:26.087 に答える
0

文字列が見つからない場合、String.Substring は NULL を返します。

于 2013-04-07T15:23:23.913 に答える