0

現在、ユーザーの連絡先の詳細をファイルに保存するアプリケーションをテストしています。この情報は、主要な方法として、ローカルのコンパクト データベースにも保存されます。このファイルに詳細を保存することで、詳細が失われた場合のバックアップになります。

テストに使用しているファイルには個人データが含まれているため、行をプレースホルダーに置き換えていることを理解していただければ幸いです。このファイルの構造は次のとおりです (最初の行を除く)。

File: 


Business Name
Mr.
Joe
Bloggs
user@email.com

Address Line 1
Address Line 2
City
Postcode
Country        




07777123456

以下に、このファイルを読み取り、各行を変数として格納するコードをいくつか示します。ファイルの構造は変更されないため、コードは非常に単純です。

public static bool RestoreBusinessTable(out string title, out string busName, out string mobileNumber, out string firstName, out string lastName)
        {    
            string email = "", referral = "", contactNo, addressLine1 = "", addressLine2 = "", city = "", postcode = "", country = "", district = "";
            busName = null;
            mobileNumber = null;
            firstName = null;
            lastName = null;
            title = null;

            try
            {
                if (!File.Exists(fileName))
                    return false;
                StreamReader sr = new StreamReader(fileName);
                string work;
                work = sr.ReadLine();   // Empty line
                work = sr.ReadLine();   // Empty line
                busName = sr.ReadLine();
                title = sr.ReadLine();
                firstName = sr.ReadLine();
                lastName = sr.ReadLine();
                email = sr.ReadLine();
                referral = sr.ReadLine();
                addressLine1 = sr.ReadLine();
                addressLine2 = sr.ReadLine();
                city = sr.ReadLine();
                postcode = sr.ReadLine();
                country = sr.ReadLine();
                work = sr.ReadLine();  // Empty line
                work = sr.ReadLine();   // Empty line
                contactNo = sr.ReadLine();
                district = sr.ReadLine();
                mobileNumber = sr.ReadLine();
                sr.Close();
                // Add to database here
                return true;
            }
            catch
            {
                return false;
            }
        }

このコードを実行すると、 、 、 、および all の値が であることbusNametitle気付きfirstNameましlastName07777123456。データは次のようになりました。

07777123456
07777123456
07777123456
07777123456
user@email.com

Address Line 1
Address Line 2
City
Postcode
Country




07777123456

同時にファイルに書き込みを行っている非同期プロセスまたはスレッドはありません。ここで何が起こっているのか、なぜ最初の 4 行が携帯電話の番号として表示されるのか、誰かに光を当てることはできますか?

4

1 に答える 1

5

これを行う 1 つの方法は、呼び出しコードが同じ変数/フィールドのアドレスをさまざまなoutパラメーターに提供することです。

string tmp;
RestoreBusinessTable(out tmp, out tmp, out tmp, ...);

titleここでは、同じアドレスが各場所に渡されるため、コードが、busNameなどに割り当てられているかどうかに関係なく、同じ実際の場所に書き込んでいます

が最後に割り当てられるためmobileNumber、携帯電話番号に割り当てられる値は、すべての値に表示される値になります。

ここでの重要なポイントはtitlebusName、 などはそれぞれが文字列への参照ではないということです。out(またはrefと同じように) それらはそれぞれ文字列への参照への参照です。

于 2013-05-02T13:20:22.323 に答える