2010-07-31 46 views
0

對不起標題外部改變,我不認爲我可以解釋是正確的:如何將公共變量的屬性從類

這是一個簡單的例子類,這是工作確定。 (我也有一個Save()方法)

public class busItem 
    { 

     public Item vItem; 

     public busItem(int pItem_Id) 
     { 
      DBDataContext db = new DBDataContext(); 

      Item vItemQuery = (from i in db.Items 
           where i.Id == pItem_Id 
           select i).FirstOrDefault(); 

      vItem = new Item(); 

      vItem.Id = vItemQuery.Id; 
      vItem.Desc = vItemQuery.Desc; 

     } 
    } 

這是我的代碼隱藏呼叫:

busItem item = new busItem(1); 
item.vItem.Desc = "new description"; 

的問題是,當我試圖通過「新說明」,我得到一個「空引用」異常。我怎樣才能做到這一點?

+3

公開的字段?哦,恐怖!至少使用一個屬性。 – Oded 2010-07-31 21:07:41

回答

0

首先,至少有兩個原因,該代碼看起來不正確。查詢中的pItem沒有聲明;你的意思是pItem_Id?此外,帶有「新描述」的行不會以分號結尾。除非我正在查看確切的代碼,否則很可能不會顯示實際問題。其次,我懷疑錯誤實際上不是在分配「新描述」時,而是在分配vItem.Desc = vItemQuery.Desc時。我沒有看到「新描述」行如何成爲問題,但是如果查詢返回null因爲它找不到請求的對象,那麼在嘗試獲取原始/默認描述時會出現錯誤。

編輯:確保你不排除一些顯著一段代碼,如構造函數中聲明VITEM的本地實例?

+0

是的,我發佈的代碼不是實際的代碼,因爲它真的很大。但構造函數真的工作,並正確獲取所有值 – 2010-07-31 21:18:22

+0

我不相信它。如果構造函數可以設置vItem.Desc而沒有錯誤,那麼其他代碼應該能夠設置vItem.Desc而不會出現錯誤,除非1)其他代碼已將vItem清除爲null或2)該特殊構造函數從未實際運行過...例如,如果您在構造函數中聲明瞭本地vItem,那麼它實際上永遠不會設置主vItem。 – BlueMonkMN 2010-08-01 13:41:02

+0

你說得對,我的錯。目標正在被另一種方法清除,我沒有注意到 – 2010-08-04 15:07:53

1

您可能會在構造函數中獲取空引用異常。 FirstOrDefault()如果IEnumerable中沒有項目,則返回空值,在這種情況下,訪問IdDesc將導致異常。如果構造函數正常完成,item.vItem.Desc不應該失敗。

+0

他還可以從busItem構造函數中獲取所有代碼,並將其放入try catch塊以獲取發生錯誤時的更多詳細信息。 – virious 2010-07-31 21:15:44

0

我拿了代碼Vitor發佈並添加了兩個小的模擬實現DataContext和項目,所以我有運行代碼。然後我添加了測試失敗的代碼。無論我如何處理添加到由DataContext返回的集合的Item對象,測試都會通過。

我能夠重現的唯一例外發生在構造函數中。新描述設置的行永遠不會失敗。

我在下面添加了我的代碼。

更爲一般的說明:公共成員變量通常表示設計可以改進。我建議讓這個變量變成私人的,並從那裏開始工作。在我們的團隊中,我們有一條規則,即成員變量不能公開,因爲它們會導致設計薄弱。只是我的兩分錢。

public class Item { 
    public int Id; 
    public string Desc; 
    } 

    public class DBDataContext { 
    public System.Collections.Generic.List<Item> Items { 
     get { 
      var items = new System.Collections.Generic.List<Item> { 
       new Item { 
       Desc = null, 
       Id = 1 
       } 
      }; 
      return items; 
     } 
    } 
    } 

    public class busItem { 

    public Item vItem; 

    public busItem(int pItem_Id) { 
     DBDataContext db = new DBDataContext(); 

     Item vItemQuery = (from i in db.Items 
          where i.Id == pItem_Id 
          select i).FirstOrDefault(); 

     vItem = new Item(); 

     vItem.Id = vItemQuery.Id; 
     vItem.Desc = vItemQuery.Desc; 
    } 
    } 

    [Test] 
    public void TestBusItem() { 
    busItem item = new busItem(1); 
    item.vItem.Desc = "new description"; 
    } 
0

的問題可能是這個代碼:

Item vItemQuery = (from i in db.Items 
          where i.Id == pItem_Id 
          select i).FirstOrDefault(); 

FirstOrDefault將返回的第一個項目,或默認。由於Item是一個類,所以默認值爲null,並且您不能在null上設置成員。 你需要在上面的語句之後測試null,如果它爲null,則手動實例化。 此外,像這樣的公共領域是一個非常不好的主意