//找到解决方案...... 问题实际上是我在创建时填充了一个寄存器数组(构造方法),并且该数组没有实例化。
为了简短起见,我甚至在建设者中设置了一个断点,看看.Net是否处理了第一次机会异常。
再次感谢所有回复者。你真的很有帮助。 :) 再次抱歉我的诺言
我今天学到了什么: - 你永远不知道.net会如何合并你的部分类 - 更了解第一次机会异常
//状态变化2012/01/30 17:00左右 对不起,我缩小了错误的问题。这里解释的问题似乎并不是由提供的代码引起的,因此这个问题不再需要存在。 感谢回复!
//已弃用,已关闭...... W / E
我有一个可以通过各种注册表联系的设备,如0x01,0x02,0x03 ...... 此外,我在一个开发环境中工作,我生产的应用程序面向我们自己的环境中的小型公司。
要将这些注册表转换为对象,我很久以前就选择创建一个私有的构造函数来创建它自己的实例(据我所知,多吨设计模式)。
由于现在有很多注册表,并且类文件变得越来越大,我想将它分成几部分:属性/函数定义和多吨对象。
当我尝试使用此ex时: Register.cs:
namespace DeviceManagement.Register
{
public partial class Register
{
public int id { get; private set; }
public string foo { get; private set; }
public string bar { get; private set; }
protected Register(RegisterEnum id, string foo, string bar)
{
this.id = (int)id;
this.foo = foo;
this.bar = bar;
}
}
}
Register.enum.cs:
namespace DeviceManagement.Register
{
public partial class Register
{
protected enum RegisterEnum
{
reg1 = 0x01,
reg2 = 0x02 //and so on
};
}
}
Register.const.cs:
namespace DeviceManagement.Register
{
public partial class Register
{
public static readonly Register reg1 =
new Register(RegisterEnum.reg1,"foo1","bar1");
public static readonly Register reg2 =
new Register(RegisterEnum.reg2,"foo2","bar2");
//there is plenty more
}
}
我打算像
一样使用它namespace DeviceManagement
{
class SomeClassA
{
public void doThisOnDevice(Device device)
{
device.doSomeStuffOn(Register.Register.reg1, SomeCommonlyUsedStrategy);
}
}
}
这是我做过的测试:
namespace DeviceManagement
{
class SomeClassA
{
public void testIfNull()
{
if(Register.Register.reg1 == null)
MessageBox.Show("It is null");
}
}
}
compilator,intellisense不会抛出任何错误/警告,但是当我运行我的项目时,Register对象永远不会被实例化。尽管如此,当所有这些代码都在同一个类(非部分)并且显然在同一个文件中时,我没有这个问题。
我有点迷茫,请帮帮我。
答案 0 :(得分:1)
对于初学者,您不需要将其分解为部分类以将其包含在多个文件中。如果你想将它们组合在一起,那么你可以将它放在不同的子命名空间中,无论如何...
它看起来像命名空间问题,因为您需要使用Register.Register.reg1来访问静态const。
修改强>
好的,所以从反馈和重新阅读这个问题几次,我感觉当前的设计可能不会完全在同一个类定义中工作。我想你可能会试图强迫某些事情不会发生。
那么,为什么不尝试这样的事情:
namespace DeviceManagement.Register
{
public class Register
{
public RegisterType Type { get; private set; }
public string Foo { get; private set; }
public string Bar { get; private set; }
public Register(RegisterType type, string foo, string bar)
{
Type = type;
Foo = foo;
Bar = bar;
}
}
public enum RegisterType
{
reg1 = 0x01,
reg2 = 0x02 //and so on
}
public static class RegisterFactory
{
private static readonly Dictionary<RegisterType, Register> _dictionary = new Dictionary<RegisterType, Register>
{
{ RegisterType.reg1, new Register(RegisterType.reg1, "foo", "bar") },
{ RegisterType.reg2, new Register(RegisterType.reg2, "foo2", "bar2") }
};
public static Register GetRegister(RegisterType type)
{
return _dictionary[type];
}
}
}
并使用寄存器:
public class SomeClassA
{
public void DoThisOnDevice(Device device)
{
device.DoSomeStuffOn(RegisterFactory.GetRegister(RegisterType.reg1), SomeCommonlyUsedStrategy);
}
}
然后,您可以更进一步,从配置文件中加载注册表详细信息,该文件在启动应用程序时对其进行解析,然后您可以从UI等处选择要处理的注册表类型。
希望我没有错误的结束。
答案 1 :(得分:0)
我复制粘贴你的代码,它对我来说很好。
我的建议是使用Visual Studio的Class View
。在这里,您可以轻松查看是否所有部分类都在同一名称空间中定义,并且具有完全相同的类名。如果没有,将出现太多名称空间或类。