2010-07-31 44 views
0

对不起标题外部改变,我不认为我可以解释是正确的:如何将公共变量的属性从类

这是一个简单的例子类,这是工作确定。 (我也有一个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"; 

的问题是,当我试图通过“新说明”,我得到一个“空引用”异常。我怎样才能做到这一点?

+3

公开的字段?哦,恐怖!至少使用一个属性。 – Oded 2010-07-31 21:07:41

回答

0

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

编辑:确保你不排除一些显著一段代码,如构造函数中声明VITEM的本地实例?

+0

是的,我发布的代码不是实际的代码,因为它真的很大。但构造函数真的工作,并正确获取所有值 – 2010-07-31 21:18:22

+0

我不相信它。如果构造函数可以设置vItem.Desc而没有错误,那么其他代码应该能够设置vItem.Desc而不会出现错误,除非1)其他代码已将vItem清除为null或2)该特殊构造函数从未实际运行过...例如,如果您在构造函数中声明了本地vItem,那么它实际上永远不会设置主vItem。 – BlueMonkMN 2010-08-01 13:41:02

+0

你说得对,我的错。目标正在被另一种方法清除,我没有注意到 – 2010-08-04 15:07:53

1

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

+0

他还可以从busItem构造函数中获取所有代码,并将其放入try catch块以获取发生错误时的更多详细信息。 – virious 2010-07-31 21:15:44

0

我拿了代码Vitor发布并添加了两个小的模拟实现DataContext和项目,所以我有运行代码。然后我添加了测试失败的代码。无论我如何处理添加到由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"; 
    } 
0

的问题可能是这个代码:

Item vItemQuery = (from i in db.Items 
          where i.Id == pItem_Id 
          select i).FirstOrDefault(); 

FirstOrDefault将返回的第一个项目,或默认。由于Item是一个类,所以默认值为null,并且您不能在null上设置成员。 你需要在上面的语句之后测试null,如果它为null,则手动实例化。 此外,像这样的公共领域是一个非常不好的主意