![](/img/trans.png)
[英]Access static variable outside of class or non static variable change in public void
[英]How to change an attribute of a public variable from outside the class
對不起標題,我認為我無法正確解釋:
這是一個簡化的示例類,可以正常工作。 (我也有一個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";
問題是,當我嘗試傳遞“新描述”時,出現“空引用”異常。 我怎樣才能做到這一點?
您可能在構造函數中得到了null引用異常。 如果IEnumerable
中沒有任何項目,則FirstOrDefault()
可以返回null,在這種情況下,訪問Id
和Desc
將導致異常。 如果構造函數正常完成,則item.vItem.Desc
應該不會失敗。
首先,由於至少兩個原因,該代碼看起來不正確。 查詢中的pItem未聲明; 你是說pItem_Id嗎? 同樣,帶有“新描述”的行也不以分號結尾。 除非我查看的是確切的代碼,否則實際問題很可能不會被看到。 其次,我懷疑錯誤實際上不是在您分配“新描述”時而是在您分配vItem.Desc = vItemQuery.Desc時出現的。 我看不到“新描述”行怎么可能出現問題,但是如果查詢由於找不到所請求的對象而返回null,則在嘗試獲取原始/默認描述時會出現錯誤。
編輯:您確定沒有排除一些重要的代碼片段,例如在構造函數中聲明vItem的本地實例嗎?
我采用了Vitor發布的代碼,並為DataContext和Item添加了兩個小的模擬實現,因此我可以運行代碼。 然后,我添加了在測試中失敗的代碼。 無論我對添加到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";
}
問題可能是此代碼:
Item vItemQuery = (from i in db.Items
where i.Id == pItem_Id
select i).FirstOrDefault();
FirstOrDefault將返回第一項或默認值。 因為Item是一個類,所以默認值為null,並且不能將成員設置為null。 您需要在上述語句之后測試null,如果為null,請手動實例化。 而且,像這樣的公共領域是一個非常糟糕的主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.