2012-05-22 46 views
-1

In a previous question我詢問了標題錯誤消息,答案几乎是非常明顯的。「非靜態字段需要對象引用」重新訪問

然而,這個「蒸發」的例子來自一些不太稀釋的代碼,現在原來的問題再次出現在我的新肉湯中。

我懷疑我可能要開自己交給了很多「有趣」的評論,但哎...有沒有這樣的事情愚蠢的問題,只有愚蠢的程序員!」

不管怎麼說,這只是一個輕微原代碼的水煮版本:

public partial class Form1 : Form 
{ 
    public static Form1 mForm = new Form1(); 


    // define textbox parameter structure 
    struct ParmStruct 
    { 
     public TextBox sTextBoxName; 
     public double dMinValue; 
     public double dMaxValue; 

     public ParmStruct(TextBox sTextBoxName, double dMinValue, double dMaxValue) 
     { 
      this.sTextBoxName = sTextBoxName; 
      this.dMinValue = dMinValue; 
      this.dMaxValue = dMaxValue; 
     } 
    } 

    // Create list of Parameters (name, min, max) 
    static ParmStruct[] ParmList = new ParmStruct[] 
    { 
     new ParmStruct { sTextBoxName = mForm.textBox1, dMinValue = -99, dMaxValue = 99 }, 
     new ParmStruct { sTextBoxName = textBox2, dMinValue = 0, dMaxValue = 100 } 
    }; 

    public Form1() 
    { 
     InitializeComponent(); 

     this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); 
    } 

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     TextBox tb1; 

     tb1 = mForm.textBox1; 
     tb1 = textBox2; 

     double x = ParmList[0].dMaxValue; 
    } 
} 

的ParmList初始化(sTextBoxName = textBox2)的第二線將無法編譯,除非我讓sTextBoxName = mForm.textBox2.

然而,線tb1 = textBox2將編譯,不需要mForm。字首。

這是最初引起混淆的實際情況(就我而言,仍然存在)。

不知道爲什麼編譯器(VS 2010)可以在一種情況下計算出來,而不是在另一種情況下。

唉......編譯時代碼工作。 :)

+0

你可以顯示文本框在哪裏以及如何聲明? – 3Pi

+0

@ 3Pi可能在「Form1.Designer.cs」中 –

+0

可能是,但是編程中的假設往往是錯誤的來源。更好地確定,特別是對於應該以相同的方式行事但不是 – 3Pi

回答

0

textBox2是一個只存在於mForm上下文中的對象,因此您必須將其作爲mForm的一個字段來使用,因爲它尚未在您的方法中聲明或作爲類中的[static]對象。

+0

我必須說我從來沒有在任何地方及時(並準確地!)的態度! – user1408942

+0

它不存在* only *在'mForm'的上下文中。 Form1的每個實例都有自己的'textBox2'。 –

+0

的確如此。然而,params的靜態構造函數沒有辦法獲得textBox2的任何實例,除了與mForm相關的實例之外,所以從列表構造函數的角度來看,它只存在於mForm的上下文中。 – Kell

2

這是一個問題。

// Create list of Parameters (name, min, max) 
static ParmStruct[] ParmList = new ParmStruct[] 
{ 
    new ParmStruct { sTextBoxName = mForm.textBox1, dMinValue = -99, dMaxValue = 99 }, 
    new ParmStruct { sTextBoxName = textBox2, dMinValue = 0, dMaxValue = 100 } 
}; 

它沒有任何意義爲Form1所有實例(這是static關鍵字做什麼)之間共享這個變量,因爲表單的每個實例都有自己獨特的textBox2。此外,根據Chris的建議,簡單地刪除關鍵字static也不是一個解決方法。在創建它之前,您不能參考textBox2,這發生在InitializeComponent內(由Form1構造函數調用)。這將是更好的:

// list of Parameters (name, min, max) 
ParmStruct[] ParmList; 

public Form1() 
{ 
    InitializeComponent(); 

    // now the textboxes exist and can be associated with the structure 
    ParmList = new ParmStruct[] { 
     new ParmStruct { sTextBoxName = textBox1, dMinValue = -99, dMaxValue = 99 }, 
     new ParmStruct { sTextBoxName = textBox2, dMinValue = 0, dMaxValue = 100 } 
    }; 

    this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); 
} 

裏面既構造函數和textBox1_TextChanged方法,你可以參考textBox1textBox2沒有任何進一步的資格,編譯器會找到屬於this對象的,就好像您鍵入this.textBox1 (參見例如構造函數的最後一個例子)。編譯器將不使用來自mForm的文本框。實際上,靜態mForm字段沒有任何理由,因爲沒有代碼可以顯示它。

+0

+1第二行不需要對象引用,因爲它隱含地是'this'。 –

+0

@Cicada:你的意思是'TextChanged'訂閱?這與問題中的代碼完全相同,看起來像設計師生成的。 –

+0

OP想知道爲什麼'但是,行tb1 = textBox2將編譯,而不需要mForm。前綴。「我認爲解釋它編譯的原因很好(並且不涉及mForm的字段)。 OP認爲編譯器*認爲它*,但它沒有。 –

相關問題