繁体   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