StreamReader.ReadLine()出现意外结果

时间:2013-05-02 13:12:52

标签: c#

我目前正在测试将用户的联系人详细信息存储在文件中的应用程序。此信息也存储在本地压缩数据库中作为主要方法 - 将这些信息存储在此文件中是一个备份,以防这些细节丢失。

我用于测试的文件中包含我的个人数据,所以我希望您理解我已经用占位符替换了这些行!该文件的结构如下(减去第一行):

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

运行此代码时,我注意到busNametitlefirstNamelastName的值均为07777123456。数据看起来像这样:

07777123456
07777123456
07777123456
07777123456
user@email.com

Address Line 1
Address Line 2
City
Postcode
Country




07777123456

我没有任何同时写入文件的异步进程或线程。任何人都可以了解这里发生的事情,以及为什么前四行会显示为手机号码?

1 个答案:

答案 0 :(得分:5)

这样做的一种方法是调用代码为各种out参数提供相同的变量/字段地址:

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

此处,每个位置都会传递相同的地址,因此无论您的代码是分配给titlebusName等,它都是写入相同的实际位置

由于最后分配了mobileNumber,因此为移动电话号码指定的值将是为所有值显示的值。

这里的关键点是titlebusName等不是每个对字符串的引用 - 因为out(或{{ 1}},同样地,它们都是对字符串的引用的引用。