簡體   English   中英

如何從類外部更改公共變量的屬性

[英]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,在這種情況下,訪問IdDesc將導致異常。 如果構造函數正常完成,則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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM