2011-12-03 36 views
3

私は以下のコードを持っているので、技術的にはすべてdb.txtファイルを1行ずつ読み込んでから、0を配列いわゆるパスワードです。フィールド初期化子は非静的なフィールド、メソッド、またはプロパティを参照できません

private string[] lines = System.IO.File.ReadAllLines(@"U:\Final Projects\Bank\ATM\db.txt"); 
private string[] password = lines[0].Split(' '); 

が、私はエラーを取得:

A field initializer cannot reference the non-static field, method, or property

答えて

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(" "); 
} 

} 
2

あるまさに氏は述べています!それらは(インスタンス)フィールド初期化子であり、お互いを参照することはできません。代わりにコードをコンストラクタに移動するか、フィールドではなくメソッド変数にします。

4

C#では、ファイル初期化の際に特定の実行順序が保証されません。
例えば次の2行のコードは、未定義の結果生成されます:理論で

private int a = b + 1; 
private int b = a + 1; 

を、二つの可能な結果= 1、B = 2、A = 2、B = 1であるが、実際にそれがあってもです最悪。 aとbがデフォルト値(intの場合は0)に初期化されているかどうかはわからないので、何でも構いません(初期化されていないオブジェクトへの参照と同じです)。 この不可能な解決シナリオを回避するために、コンパイラは、すべてのフィールドの初期化を実行時定数にするよう要求します(実行時および実行時定数とは無関係に毎回同じ値を返します)変数)。

複合フィールドを初期化するときにコンストラクタを使用するだけで、人生は再び甘くなります。

1

エラーは自己説明的です。 (それは、あなたができる静的の場合)ラインとパスワードの両方がフィールド変数であり、あなたがそれらの

1を割り当てることはできませんので、あなたがこれを行うことはできません

は他に価値。

オブジェクト内にこれらのフィールド変数が存在しないので、相互に割り当てることができない限り、クラス内でこのコードを使用することをお勧めします。

関連する問題