c# - 是否可以在函数结束或超出范围后重置静态字段?
问题描述
我有多种类型的组件类和 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
我怎样才能做到这一点?
解决方案
我不是让组件负责命名自己,而是创建一个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;
}
}
推荐阅读
- tcp - TCP/HTTPS 是否保证文件上传/下载的完整性?
- sql - PL/SQL ORACLE 错误:我的代码中的 PLS-00225
- android - FAILURE:任务“:app:processDebugResources”执行失败
- macos - iTerm2 点击打开选定路径
- embedded - Segger Jlink flash下载机制
- c# - 是否可以从 Azure 函数中保留环境设置?
- python - 可以使用不和谐机器人发送定义的字符串
- oracle19c - 当我尝试从 java 创建用户时,Oracle 19C 中出现错误 ORA-65096
- asp.net-core-mvc - 在不使用 DI 的情况下读取我的 .Net 5 应用程序中的应用程序设置
- javascript - FullCalendar v5.x 中 eventAfterAllRender 的替代选项