如何实现自定义类,每个值集只有一个实例(不是单例)

时间:2017-07-28 08:00:43

标签: c# enums static constants

我有一个自定义类,如下所示,有两个枚举:

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

1 个答案:

答案 0 :(得分:1)

您可以创建静态列表MCodesPool,并在创建时添加MCode。通过覆盖像

这样的GethashCode()方法来区分代码
return (byte)AEnum * 256 * 256  +  (byte)BEnum * 256 * C;

因此,当您构建MCode时,您可以检查您的MCodesPool是否包含已创建HashCode的MCode。

P.S。如果您打算创建大量对象,请使用已排序的集合。