Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从类外部更改公共变量的属性_C#_.net_Visual Studio 2008_Oop - Fatal编程技术网

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

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将导致异常。

关于标题,很抱歉,我想我无法正确解释:

这是一个简化的示例类,工作正常。(我还有一个Save()方法)

这是我的代码隐藏呼叫:

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();