如何从类外部更改公共变量的属性

抱歉标题,我认为我无法解释它:

这是一个简化的示例类,这个工作正常。 (我也有一个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"; 

问题是,当我尝试传递“新描述”时,我得到一个“空引用”exception。 我怎样才能做到这一点?

首先,该代码至少有两个原因看起来不正确。 查询中的pItem未声明; 你的意思是pItem_Id? 此外,带有“新描述”的行不以分号结尾。 除非我正在查看您所拥有的确切代码,否则实际问题很可能无法显现。 其次,我怀疑在分配“新描述”时,但在分配vItem.Desc = vItemQuery.Desc时,实际上并不是错误。 我没有看到“新描述”行如何成为问题,但如果查询返回null因为找不到请求的对象,则在尝试获取原始/默认描述时会出错。

编辑:确定你没有排除一些重要的代码,比如在构造函数中声明一个本地vItem实例吗?

您可能在构造函数中获取了null引用exception。 如果IEnumerable中没有项,则FirstOrDefault()可以返回null,在这种情况下,访问IdDesc将导致exception。 如果构造函数正常完成,则item.vItem.Desc不应该失败。

我接受了Vitor发布的代码并为DataContext和Item添加了两个小的模拟实现,因此我运行了代码。 然后我添加了测试失败的代码。 无论我如何处理我添加到DataContext返回的集合的Item对象,测试都会通过。

我能够重现的唯一例外发生在构造函数中。 设置新描述的行永远不会失败。

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

更一般地说:公共成员变量通常表示可以改进设计。 我建议将此变量设为私有并从那里开始工作。 在我们的团队中,我们有一条规则,即成员变量不能公开,因为它们会导致设计薄弱。 只是我的两分钱。

  public class Item { public int Id; public string Desc; } public class DBDataContext { public System.Collections.Generic.List Items { get { var items = new System.Collections.Generic.List { 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,则手动实例化。 此外,像这样的公共领域是一个非常糟糕的主意。