2011-12-03 50 views
3

好的,我有下面的代碼,從技術上講它所做的全部是逐行讀取db.txt文件,然後它假設將行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#不保證任何特定的執行順序。
例如的這兩行代碼將產生不確定的結果:

private int a = b + 1; 
private int b = a + 1; 
理論上

,所述兩個可能的結果是A = 1,B = 2或= 2,B = 1,但實際上它甚至最糟糕的。我們甚至不知道a和b是否已初始化爲它們的默認值(在int爲0的情況下),所以它可以是任何東西(就像對未初始化對象的引用一樣)。 爲了避免這種無法解決的情況,編譯器要求所有的字段初始化都是「運行時常量」(每次執行時都會返回相同的值,並且與其他任何非「運行時常量」無關)變量)。

只需在初始化化合物字段時使用該構造函數,生命就會再次變甜。

1

錯誤是不言自明的。

你不能這樣做,因爲線和口令都是字段變量,你不能分配

其中的一個值等(如果它是一個靜態的,那麼你可以)。

我希望你在類內部使用這個代碼,這樣除非一個對象沒有創建它們這些字段變量的實際存在,所以你不能將它們分配給對方。

相關問題