我目前正在测试将用户的联系人详细信息存储在文件中的应用程序。此信息也存储在本地压缩数据库中作为主要方法 - 将这些信息存储在此文件中是一个备份,以防这些细节丢失。
我用于测试的文件中包含我的个人数据,所以我希望您理解我已经用占位符替换了这些行!该文件的结构如下(减去第一行):
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;
}
}
运行此代码时,我注意到busName
,title
,firstName
和lastName
的值均为07777123456
。数据看起来像这样:
07777123456
07777123456
07777123456
07777123456
user@email.com
Address Line 1
Address Line 2
City
Postcode
Country
07777123456
我没有任何同时写入文件的异步进程或线程。任何人都可以了解这里发生的事情,以及为什么前四行会显示为手机号码?
答案 0 :(得分:5)
这样做的一种方法是调用代码为各种out
参数提供相同的变量/字段地址:
string tmp;
RestoreBusinessTable(out tmp, out tmp, out tmp, ...);
此处,每个位置都会传递相同的地址,因此无论您的代码是分配给title
,busName
等,它都是写入相同的实际位置。
由于最后分配了mobileNumber
,因此为移动电话号码指定的值将是为所有值显示的值。
这里的关键点是title
,busName
等不是每个对字符串的引用 - 因为out
(或{{ 1}},同样地,它们都是对字符串的引用的引用。