C# 字段初始值设定项不能引用非静态字段、方法或属性
好的,我有下面的代码,从技术上讲,它所做的只是逐行读取C# 字段初始值设定项不能引用非静态字段、方法或属性,c#,visual-studio,visual-studio-2010,C#,Visual Studio,Visual Studio 2010,好的,我有下面的代码,从技术上讲,它所做的只是逐行读取db.txt文件,然后假设将该行0拆分为一个名为password的数组 private string[] lines = System.IO.File.ReadAllLines(@"U:\Final Projects\Bank\ATM\db.txt"); private string[] password = lines[0].Split(' '); 但我得到了一个错误: 字段初始值设定项不能引用非静态字段、方法或属性 正是他说的!这些是(
db.txt
文件,然后假设将该行0
拆分为一个名为password的数组
private string[] lines = System.IO.File.ReadAllLines(@"U:\Final Projects\Bank\ATM\db.txt");
private string[] password = lines[0].Split(' ');
但我得到了一个错误:
字段初始值设定项不能引用非静态字段、方法或属性
正是他说的!这些是(实例)字段初始值设定项,不能相互引用。将代码移到构造函数中,或者使其成为方法变量而不是字段。思考一下上述内容的含义以及如何填充这些变量。您需要首先构造它们所属的类,然后希望代码行按您希望的顺序执行,并且它们不会引发异常 编译器实际上告诉您这不是正确的方法 更好的方法是简单地编写一个函数来执行您想要的操作:
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(" ");
}
}
对于文件初始化,C#不保证任何特定的执行顺序。例如,这两行代码将产生未定义的结果:
private int a = b + 1;
private int b = a + 1;
理论上,两种可能的结果是a=1,b=2或a=2,b=1,但事实上这甚至是最糟糕的。我们甚至不知道a和b是否已经初始化为它们的默认值(int的情况下为0),所以它可以是任何东西(就像对未初始化对象的引用)。
为了避免这种无法解决的情况,编译器要求所有字段初始化都是“运行时常量”(每次执行时都返回相同的值,并且与任何其他非“运行时常量”变量无关)
只要在初始化复合字段时使用构造函数,生活就会再次愉快。错误是不言自明的 您不能这样做,因为行和密码都是字段变量,您不能分配 其中一个值对另一个值(如果它是静态的,那么您可以) 我希望您在一个类中使用这段代码,除非对象没有创建它们,否则这些字段变量就不存在了,所以您不能将它们分配给彼此