![](/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.