如何在C#中实现带有静态对象定义的分部类
本文关键字:定义 对象 静态 实现 | 更新日期: 2023-09-27 18:21:51
//找到解决方案。。。事实上,问题是我在创建时填充了一个寄存器数组(构造函数方法),而该数组没有初始化。
简而言之,我太笨了,甚至没有在构造函数中设置一个断点来查看.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");
}
}
}
编译器intellisense不会抛出任何错误/警告,但当我运行项目时,Register对象永远不会被实例化。尽管如此,当所有这些代码都在同一个类(而不是部分)中,并且显然在同一文件中时,我没有这个问题。
我有点迷路了,请帮帮我。
对于初学者来说,您不需要将它分解为一个分部类来覆盖多个文件。如果你想把它拼凑在一起,那么你可以把它放在不同文件中的不同子命名空间中,无论如何。。。
这看起来像是一个命名空间问题,因为您需要使用Register.Register.reg1来访问静态常量。
编辑
好吧,所以从反馈和重读这个问题几次中,我感觉目前的设计可能不会完全适用于同一类定义。我想你可能是想把一些不会发生的事情强加给别人。
那么,为什么不试试这样的东西呢:
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等中选择要处理的注册表类型。
希望我没有搞错。
我复制粘贴了你的代码,它对我来说很好。
我的建议是使用Visual Studio的Class View
。在这里,您可以很容易地看到是否所有的分部类都是在同一个命名空间中定义的,并且具有完全相同的类名。否则,将出现过多的命名空间或类。