如何在Form1与Satellite、Radar类间传folders列表并避免循环实例化
解决循环实例化问题的三种可行方案
问题核心是在Satellite/Radar类中主动创建了新的Form1实例,而非复用当前已经存在的Form1实例,才触发了无限循环的实例化流程。可以按需选择以下任意一种方案解决:
方案1:构造函数传递folders列表(最推荐,耦合度最低)
仅把Satellite/Radar需要的folders列表通过构造函数传入,不需要传递整个Form1实例,代码耦合度最低。
第一步:修改Satellite/Radar类代码
删除类中Form1 f1 = new Form1();的定义,新增私有字段存储传入的folders,同时新增带参数的构造函数:
namespace Extract { class Satellite { private List<string> satelliteUrls = new List<string>(); private string mainUrl = "https://de.sat24.com/de/eu/infraPolair/"; private string[] statements; // 新增私有字段存储folders private List<string> _folders; // 新增带参数的构造函数 public Satellite(List<string> folders) { _folders = folders; } // 类内其他方法直接使用 _folders 即可访问该列表 } }
Radar类做完全相同的修改即可。
第二步:修改Form1实例化代码
在Form1构造函数实例化Satellite和Radar时,把当前Form1的folders列表作为参数传入:
sat = new Satellite(folders); rad = new Radar(folders);
方案2:构造函数传递当前Form1实例
如果Satellite/Radar后续还需要访问Form1的其他公共成员,可以直接把当前运行的Form1实例传入,不需要创建新的Form1实例。
第一步:修改Satellite/Radar类代码
namespace Extract { class Satellite { private List<string> satelliteUrls = new List<string>(); private string mainUrl = "https://de.sat24.com/de/eu/infraPolair/"; private string[] statements; private Form1 _currentForm1; public Satellite(Form1 form1) { _currentForm1 = form1; } // 类内使用 _currentForm1.folders 访问列表,也可访问Form1其他公共成员 } }
第二步:修改Form1实例化代码
实例化时传入this(指代当前正在运行的Form1实例):
sat = new Satellite(this); rad = new Radar(this);
方案3:属性注入
如果实例化Satellite/Radar时,folders列表还没有完成初始化,可以选择属性注入的方式:
第一步:修改Satellite/Radar类代码
新增公共的Folders属性:
namespace Extract { class Satellite { private List<string> satelliteUrls = new List<string>(); private string mainUrl = "https://de.sat24.com/de/eu/infraPolair/"; private string[] statements; // 新增公共属性 public List<string> Folders { get; set; } } }
第二步:Form1中给属性赋值
sat = new Satellite(); sat.Folders = folders; rad = new Radar(); rad.Folders = folders;
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

