我有一个自定义类,如下所示,有两个枚举:
public class MCode
{
public AEnum A { get; }
public BEnum B { get; }
public byte C { get; }
//Some constructors and methods
}
我想只创建每个MCode的一个实例(如果一个MCode存在具有相同的3个值,则永远不创建MCode)然后如果我创建了一个包含MCode作为属性的对象,我就是' d喜欢它确保它与包含这样一个MCode的任何先前对象的属性相同。
就数字而言: 可能的MCode 100s的数量 运行时100s对MCode的引用数 根据值3-10的不同MCode的数量。
********************更新************************** *********
现在尝试使用Factory类,如下所示:
public static class MakeMCode
{
private static List<MCode> Instances;
public static MCode Instance(AEnum ae, Benum be, byte c)
{
var mc = Instances.Find(x=>x.GetHashCode()==MCode.GetHashCode(ae,be,c));
if (mc == null)
{
var newmc = new MCode(ae, be, c);
Instances.Add(newmc);
return newmc;
}
return mc;
}
}
我已经实现了所需的GetHashCode和静态GetHashCode,如下所示(没有第二个看起来我需要新的MCode来确定HashCode,这也是我避免使用Instances.Contains的原因)
但现在我不确定如何在MCode中实现构造函数,以便它使用MakeMCode.Instance并防止创建任何MCode而不调用MakeMCode.Instance
答案 0 :(得分:1)
您可以创建静态列表MCodesPool,并在创建时添加MCode。通过覆盖像
这样的GethashCode()方法来区分代码return (byte)AEnum * 256 * 256 + (byte)BEnum * 256 * C;
因此,当您构建MCode时,您可以检查您的MCodesPool是否包含已创建HashCode的MCode。
P.S。如果您打算创建大量对象,请使用已排序的集合。