首页 > 解决方案 > 是否可以在函数结束或超出范围后重置静态字段?

问题描述

我有多种类型的组件类和 1 个生成器类。组件类有一个名称字段,它在生成器类生成时必须是唯一的。

所以,我编写组件类和生成器类如下:

public class Component_A{
    static int iCount;
    public string name {get;set;}
    public Component_A(){
        name = String.Format("ComponentA_{0}", iCount++);
    }
}

public class Component_B{
    static int iCount;
    public string name {get;set;}
    public Component_A(){
        name = String.Format("ComponentB_{0}", iCount++);
    }
}

public class Generator(){
    public List<String> generateComponent(){
        Component_A a1 = new Component_A();
        Component_A a2 = new Component_A();
        Component_B b1 = new Component_B();

        List<string> strList = new List<string>();
        strList.Add(a1.name);
        strList.Add(a2.name);
        strList.Add(b1.name);

        return strList;
    }
}

public class MainClass(){
    public static void main(){
        Generator gen;
        for(int i=0; i<2; i++){
            gen = new Generator();
            List<String> componentNameList = gen.generateComponent();

            foreach(var s in componentNameList){
                Console.Out.WriteLine(s);
            }
            Console.Out.WriteLine();
        }

    }
}

但是,我想在初始化新生成器时重置组件 iCount 字段。

例如:上述代码执行结果为:

ComponentA_0
ComponentA_1
ComponentB_0

ComponentA_2
ComponentA_3
ComponentB_1

但我希望它是这样的:

ComponentA_0
ComponentA_1
ComponentB_0

ComponentA_0
ComponentA_1
ComponentB_0

我怎样才能做到这一点?

标签: c#

解决方案


我不是让组件负责命名自己,而是创建一个NameGenerator类,该类被赋予一个根和(可选)起始编号,它公开NextName

public class NameGenerator {
    private int _next;
    private readonly string _nameRoot;
    public NameGenerator(string nameRoot) : this (nameRoot, 0)
    {}
    public Namegenerator(string nameRoot, int firstNumber)
    {
        _next = firstNumber;
        _nameRoot = nameRoot;
    }
    public string NextName()
    {
        return String.Format("{0}_{1}", _nameRoot,_next++);
    }
}

您的Generator类现在应该拥有一组这些对象(由您决定是急切地还是懒惰地初始化这些对象),并且您的Component类应该有一个构造函数来接受NameGenerator正在吐出的名称。

public class Component_A{
    public string name {get;private set;}
    public Component_A(string name){
        this.name = name;
    }
}

推荐阅读