2014-07-16 188 views
0

我正在Silverlight上工作。我創建了一個TextBox,當用戶改變任何文本時,它應該在文件的頂部顯示「*」,並在點擊保存按鈕時應該消失。爲什麼構造函數調用多次?

我的代碼對一個文本框工作正常,但當我創建第二個文本框(第一個之後),然後我發現構造函數被調用兩次而不是一個。當我創建第三個文本框(兩個之後)構造函數被調用3次而不是一個。 (這個文本框是在我的GUI中的一個按鈕上單擊動態創建的,其中有一些文本寫在它上面,當我在文本中進行一些更改時,它會在頂部顯示「*」,並在保存時會消失)。

雖然我希望它被調用1次,如果我一次添加1個文本框。 我的代碼,這樣做是:

private bool modified; 
public bool Modified 
{ 
    get { return modified; } 
    set { modified = value; OnPropertyChanged("Modified"); } 
} 

public ClassConstructor(AnotherClass pv) 
{ 
    MessageBox.Show("Number of call check"); 
    setStar(false); 
    this.isModified = false; 
} 

private void setStar(bool modified) 
{ 

    Tab = this.FileName; 
    if (modified == false) 
    { 
     Tab += ""; 
    } 
    else 
    { 
     Tab += " *"; 
    } 
    Modified = modified; 
} 
public void TextChanged(object sender, TextChangedEventArgs e) 
{ 
    TextBox tb = (TextBox) sender; 
    setStar(!TextData.Equals(tb.Text)); 
} 
public void SaveCode(object para) 
{ 
    TextData.txt = txt; 
    setStar(false); 
} 

爲什麼這個構造函數被調用這麼多次?(我的意思是爲什麼我的MessageBox的時間,如果我創建第四個文本框)?

+0

'DelegateCommand'類的構造函數它有什麼作用?我懷疑你沒有從代表中移除方法 – Arjuna

+2

看來問題出在代碼的其他部分。 – Stilgar

+0

@Arjuna委託命令用於動態保存文本框中所做的更改,而取消取消文本框。 – Sss

回答

2

構造函數創建該類的單個實例。所以,無論何時你創建一個新的實例(在你的情況下新建一個新的TextBox),都會調用構造函數來創建該對象實例。這是構造函數的唯一目的 - To Be Called when you create an object of that class。因此,該構造函數內的代碼被執行。由於您在內部構造函數中顯示MessageBox,因此您將看到它5次,5個新對象和4次新對象4次。如在維基所述 -

實例構造有時被稱爲.ctor,用於 創建並且當新 表達被用來創建一個類的一個對象初始化任何實例成員變量。

我的第一個建議 - 瞭解構造函數是什麼,因爲除非你知道構造函數是什麼,否則你永遠不會明白爲什麼會發生這種情況。順便說一句,這不是錯誤,這是面向對象編程的特點,每當你創建一個新的實例時,構造函數都會被調用。

一個很好的起點將出現在這裏 -

Constructor (object-oriented programming)

相關問題