我是一个非常新的C#,这是我第一次使用列表做任何事情,所以这可能是一个非常愚蠢的问题......我正在尝试将文件中的数据读取到由Tourist对象组成的列表中.据我所知,我需要tourists在添加对象之前将一些内容分配给列表,但我不知道该怎么做.
class Tourist
{
public string FirstName { get; set; }
public string LastName { get; set; }
public double Contributed { get; set; }
public Tourist(string firstName, string lastName, double money)
{
FirstName = firstName;
LastName = lastName;
Contributed = money * 0.25;
}
}
class Program
{
static void Main(string[] args)
{
List<Tourist> tourists = new List<Tourist>();
ReadData(out tourists);
}
static void ReadData(out List<Tourist> tourists)
{
const string Input = "..\\..\\Duomenys.txt";
string[] lines = File.ReadAllLines(Input);
foreach (string line in lines)
{
string[] values = line.Split(';');
string firstName = values[0];
string lastName = values[1];
double money = Double.Parse(values[2]);
tourists.Add(new Tourist(firstName, lastName, money));
}
}
}
Run Code Online (Sandbox Code Playgroud)
通过声明一个参数,out你"保证"调用者(和编译器)你的方法将为该参数的参数提供的变量设置一个值.
因为您承诺,所以通过方法的每个路径都必须为此参数指定一个值.
你的方法并没有指定值tourists.如果使用引用调用方法,这实际上可能导致NullReferenceExceptionat .tourists.Add(...)null
对我来说,似乎可以ommit的out为你初始化关键字tourists已经在Main.需要注意的是ReadData只修改了列表的内容,而不是参考存储在它tourists的变量.由于您不想更改该引用(变量的值),因此您不需要out关键字.
如果要ReadData初始化它,则需要添加该行
tourists = new List<Tourist>()
Run Code Online (Sandbox Code Playgroud)
在ReadData 之前的foreach循环.
正如您的代码所代表的那样,更好的解决方案是省略任何参数ReadData,让方法返回列表:
static List<Tourist> ReadData()
{
// create list
List<Tourist> tourists = new List<Tourist>();
const string Input = "..\\..\\Duomenys.txt";
string[] lines = File.ReadAllLines(Input);
foreach (string line in lines)
{
// shortened for brevity
tourists.Add(new Tourist(firstName, lastName, money));
}
return tourists; // return newly created list
}
Run Code Online (Sandbox Code Playgroud)
并使用Main如下:
static void Main(string[] args)
{
List<Tourist> tourists = ReadData();
}
Run Code Online (Sandbox Code Playgroud)