如何实现实例编号?

时间:2011-02-18 23:06:42

标签: c# .net

我不知道标题是否清晰,但基本上我试图实现这样的事情:

public class Effect
{
    public int InternalId ...

    public void ResetName() ...
}

当调用ResetName时,这会将对象的名称重置为:

"Effect " + someIndex;

因此,如果我有5个Effect个实例,它们将被重命名为:

"Effect 1"
"Effect 2"
"Effect 3"
...

所以我在另一个管理器/容器类型中有另一个方法(ResetNames),为每个实例调用ResetName。现在我必须将一个整数传递给ResetName,同时将一个计数器保留在ResetNames内。但这感觉并不干净,这使我无法在经理类之外调用ResetName,这是有效的。

如何更好/更干净?

至于InternalId,它只是一些存储所有内容创建顺序的id。所以我不能仅仅依靠这些,因为数字很大,比如32000等等。

编辑:Container ResetNames代码:

int count = 1;
var effects = this.Effects.OrderBy ( n => n.InternalId );
foreach ( Effect effect in effects )
{
    effect.ResetName ( count );
    ++count;
}

5 个答案:

答案 0 :(得分:2)

有一个处理命名的管理器类。它还将处理子类的创建,并将嵌入对自身的引用。你现在可以在子类上调用ResetName(),它将让它的管理器处理任何需要完成的逻辑。

我不确定您希望结果在各种情况下到底是什么,但希望以下内容会有所帮助:

public class Effect {
{
  private EffectManager _manager;
  public string Name {get;set;}

  public Effect(EffectManager manager) {
    _manager = manager;
  }

  public void ResetName() {
    Name = _manager.GetNextName();
  }
}

public class EffectManager {
  private List<Effect> Effects;
  private int currentIndex;
  public Effect CreateEffect() {
    var e = new Effect(this);
    Effects.Add(e);
  }

  public string GetNextName() {
    return "Effect " + currentIndex++;
  }

  public void ResetAllNames() {
    currentIndex = 0;
    foreach(var effect in Effects) {
      effect.Name = GetNextName();
    }
  }
}

答案 1 :(得分:0)

许多可能性之一:为您的Effect类提供公共属性Name,并在填充Effect对象的列表或数组的方法中,指定名称。您还可以为Effect类提供一个整数属性并设置数字,以便您可以根据需要对它们进行排序。

public class Effect() 
{  
  public string Name() { get; set; }
}

public class SomeClass()
{
  private List<Effect> Effects;

  public static void WhateverMethod()
  {
    for (var i = 0; i < Effects.Count; i++)
      Effects[i].Name = "Effect " + (i + 1).ToString();
  }
}

答案 2 :(得分:0)

不是让Name成为存储属性,你可以这样做吗?

public class Effect
{
    public int InternalId ...
    public int Index;
    public string BaseName;
    public string Name
    {
       get
       {
          return BaseName + index;
       }
    }
}

答案 3 :(得分:0)

名称是特定于所有实例还是特定集合中的所有实例?

如果是前者你可以做类似的事情:

public class Effect
{
    private static int _lastId;

    public Effect()
    {
        InternalId = _lastId++;
    }
    public string Name 
    {
        get { return "Effect" + InternalId.ToString(); }
    }
    public int InternalId ...
}

答案 4 :(得分:0)

Namespace Diagnostics

    <Conditional("DEBUG")> _
    Public NotInheritable Class UniqueID

        Private Shared _idBase As Integer

        Private Sub New()
            'keep compiler from creating default constructor
        End Sub

        Public Shared Function GetNext() As String
            Return "ID" + System.Threading.Interlocked.Increment(_idBase).ToString("00")
        End Function

    End Class

End Namespace