2009-11-04 24 views
1

我有一個字符串屬性,它定義了一個xml文件的文件名。當用戶將該文件名輸入到屬性中時,我設置setter在設置'fileName = value'後立即調用parseXml()函數以使用來自XML文件的數據填充dataTable,以便它顯示在設計器中。出於某種原因,當我在屬性設置器中調用此函數時,每次更改屬性時setter最終都會調用兩次,第二次是導致錯誤的空字符串。它爲什麼這樣做?C#:在一個字符串屬性設置器內調用方法的問題

public String FileName 
{ 
    get { return fileName; } 
    set 
    { 
     fileName = value; 
     parseXmlFile(); 
    } 
} 
+0

讓我們來看看您的代碼 – 2009-11-04 20:30:17

+0

您可以發佈代碼 - 屬性和它的使用位置。 – ChrisF 2009-11-04 20:30:23

+5

____POST代碼____ – 2009-11-04 20:30:24

回答

4

簡答:不應該。 更有幫助:也許你自己打第二個電話?在調試器上設置調試器,並在第二次調用它時檢查調用堆棧。

+0

謝謝,這回答我的問題。我只想確保它在我的代碼中存在問題,而不是在.NET中發生衝突,然後在調試時浪費了太多的時間來重構。 – alexD 2009-11-04 20:53:26

9

我最初的猜測是parseXml()中的某個東西再次調用setter。如果您刪除對parseXml()的調用會發生什麼?您是否嘗試過調試並逐步檢查代碼,以確定第二次調用setter時究竟發生了什麼?

如果您在filename = value;上打了一個斷點並點擊它,那麼callstack窗口會告訴您什麼?

+1

第一次調用該屬性時,fileName和「value」值是來自用戶的正確輸入。 parseXml函數執行時沒有問題。立即之後,它再次通過setter,現在'value'是空字符串,因此它將fileName重置爲emptyString並使用空的fileName執行parseXml(),然後導致錯誤。 – alexD 2009-11-04 20:37:08

+2

那第二次寫的callstack是什麼樣的?二傳手來自哪裏? – 2009-11-04 20:39:02

+1

** callstack窗口**第二次顯示什麼? – 2009-11-04 20:39:29

0

作爲一個完全拋開你遇到的問題,把昂貴的IO操作放在屬性設置器之後是有點過時的。

如果你想打開一個文件並解析東西等等,最好有一個單獨的方法命名爲IO,並在方法成功完成其工作時設置該屬性(文件名)。

+5

對他的問題不是一個真正的答案 - 我對他的問題發表了同樣的評論。 – 2009-11-04 20:40:14