C# 如何从类外部更改公共变量的属性
关于标题,很抱歉,我想我无法正确解释: 这是一个简化的示例类,工作正常。(我还有一个Save()方法) 这是我的代码隐藏呼叫:C# 如何从类外部更改公共变量的属性,c#,.net,visual-studio-2008,oop,C#,.net,Visual Studio 2008,Oop,关于标题,很抱歉,我想我无法正确解释: 这是一个简化的示例类,工作正常。(我还有一个Save()方法) 这是我的代码隐藏呼叫: busItem item = new busItem(1); item.vItem.Desc = "new description"; 问题是,当我尝试传递“新描述”时,我得到了一个“null reference”异常。我该怎么做呢?您可能在构造函数中遇到空引用异常。如果IEnumerable中没有项目,则可以返回null,在这种情况下,访问Id和Desc将导致异常。
busItem item = new busItem(1);
item.vItem.Desc = "new description";
问题是,当我尝试传递“新描述”时,我得到了一个“null reference”异常。我该怎么做呢?您可能在构造函数中遇到空引用异常。如果
IEnumerable
中没有项目,则可以返回null,在这种情况下,访问Id
和Desc
将导致异常。如果构造函数正常完成,item.vItem.Desc
不应该失败。首先,该代码看起来不正确,至少有两个原因。未声明查询中的pItem;你是说皮特姆?此外,带有“new description”的行不会以分号结尾。除非我看的是您的确切代码,否则实际问题很可能不会被发现。其次,我怀疑错误实际上不是在分配“新描述”时出现的,而是在分配vItem.Desc=vItemQuery.Desc时出现的。我不知道“newdescription”行怎么会有问题,但是如果查询因为找不到请求的对象而返回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";
}
公共类项目{
公共int Id;
公共字符串描述;
}
公共类DBDataContext{
public System.Collections.Generic.List项{
得到{
var items=new System.Collections.Generic.List{
新项目{
Desc=null,
Id=1
}
};
退货项目;
}
}
}
公营业务{
公共项目vItem;
公共业务项目(int pItem\U Id){
DBDataContext db=新的DBDataContext();
Item vItemQuery=(从db.Items中的i开始)
其中i.Id==pItem\u Id
选择i).FirstOrDefault();
vItem=新项();
vItem.Id=vItemQuery.Id;
vItem.Desc=vItemQuery.Desc;
}
}
[测试]
公共void TestBusItem(){
业务项=新业务项(1);
item.vItem.Desc=“新说明”;
}
问题可能在于以下代码:
Item vItemQuery = (from i in db.Items
where i.Id == pItem_Id
select i).FirstOrDefault();
FirstOrDefault将返回第一项或默认项。由于Item是一个类,所以默认值为null,并且不能在null上设置成员。
您需要在上述语句之后测试null,如果为null,则手动实例化。
另外,这样的公共字段是一个非常糟糕的主意。公共可访问字段?哦,真恐怖!至少使用一个属性。他还可以从busItem构造函数中获取所有代码,并将其放在try-catch块中,以便在出现错误时获得更详细的信息。是的,我发布的代码不是实际的代码,因为它非常大。但是构造器真的在工作,并且得到了所有正确的值,我不相信。如果构造函数可以在没有错误的情况下设置vItem.Desc,那么其他代码应该能够在没有错误的情况下设置vItem.Desc,除非1)其他代码已将vItem清除为null,或者2)特殊构造函数从未实际运行过。。。例如,如果您在构造函数中声明了一个本地vItem,那么它实际上从未设置主vItem。您是对的,我错了。物体被另一种方法清除了,我没有注意到
Item vItemQuery = (from i in db.Items
where i.Id == pItem_Id
select i).FirstOrDefault();