好的,所以我有下面的代码,从技术上讲它所做的就是逐行读取db.txt
文件,然后假设将行0
拆分成一个名为password的数组。
private string[] lines = System.IO.File.ReadAllLines(@"U:\Final Projects\Bank\ATM\db.txt");
private string[] password = lines[0].Split(' ');
但是我收到了错误:
字段初始值设定项不能引用非静态字段,方法或属性
答案 0 :(得分:4)
考虑上述含义以及您希望如何填充这些变量。您需要首先构造它们所属的类,然后希望代码行按您希望的顺序执行,并且它们不会抛出异常。
编译器有效地告诉你这不是正确的做事方式。
更好的方法是简单地编写一个函数来做你想做的事情:
private string[] PasswordLines(){
string[] lines = System.IO.File.ReadAllLines(@"U:\Final Projects\Bank\ATM\db.txt");
return lines[0].Split(" ");
}
然后您可以从任何您想要的地方拨打电话;例如:
public class MyClass()
{
private string[] Lines
{
get { return PasswordLines(); }
}
private string[] PasswordLines(){
string[] lines = System.IO.File.ReadAllLines(@"U:\Final Projects\Bank\ATM\db.txt");
return lines[0].Split(" ");
}
}
答案 1 :(得分:4)
在提交初始化时,C#不保证任何特定的执行顺序 例如,这两行代码将产生未定义的结果:
private int a = b + 1;
private int b = a + 1;
理论上,两种可能的结果是a = 1,b = 2或a = 2,b = 1,但事实上它甚至是最差的。我们甚至不知道a和b是否初始化为它们的默认值(在int的情况下为0),因此它可以是任何东西(就像对未初始化对象的引用一样)。
为了避免这种无法解决的问题,编译器要求所有字段初始化都是“运行时常量”(每次执行时返回相同的值,无论何时执行它们并独立于任何其他非“运行时常量”变量)。
初始化复合字段时只需使用构造函数,生活就会再次变得甜美。
答案 2 :(得分:2)
究竟是什么说的!那些是(实例)字段初始化器,并且不能相互引用。将代码移动到构造函数中,或者将它们变为方法变量而不是字段。
答案 3 :(得分:1)
错误是不言自明的。
你不能这样做,因为行和密码都是字段变量,你不能指定
其中一个对其他人有价值(如果它是静态的那么你可以)。
我希望你在一个类中使用这个代码,所以除非一个对象没有创建它们没有这些字段变量的真实存在,所以你不能将它们分配给彼此。