gpt4 book ai didi

c# - 为什么我的 IEnumerable UserControl 在我用 foreach 枚举它之后被处置?

转载 作者:太空狗 更新时间:2023-10-30 00:21:15 25 4
gpt4 key购买 nike

我有一个带有内部列表的用户控件,我通过实现 IEnumerable 公开了该列表。当我使用 foreach 对其进行枚举时,用户控件将被处理掉。为什么会这样?

重现示例:

using System;
using System.Collections;
using System.Drawing;
using System.Windows.Forms;

public class VanishingControl : UserControl, IEnumerable, IEnumerator
{
string[] strings = { "uno", "due", "tres" };
int position = -1;

public IEnumerator GetEnumerator()
{
return this;
}

public object Current
{
get { return strings[position]; }
}

public bool MoveNext()
{
position++;
return position < strings.Length;
}

public void Reset()
{
position = 0;
}

protected override void Dispose(bool disposing)
{
Console.WriteLine("bye!");
base.Dispose(disposing);
}
}

public class Vanish : Form
{
private VanishingControl vc = new VanishingControl();

public Vanish()
{
vc.BackColor = Color.Black;
vc.Click += vc_Click;
Controls.Add(vc);
}

void vc_Click(object sender, EventArgs e)
{
foreach (string s in vc)
Console.WriteLine(s);
}

[STAThread]
static void Main()
{
Application.Run(new Vanish());
}
}

在调试器中运行它并单击黑色方 block 。

最佳答案

IEnumerator 实现的接口(interface)之一是IDisposableforeach 循环将在处理完项目后在循环源上调用 Dispose

一个更好的解决方案是将您的 UserControl 分成两部分

  1. UserControl 减去可枚举接口(interface)
  2. 公开其包含的集合的属性/方法

例如

public class VanishingControl : UserControl
{
string[] strings = { "uno", "due", "tres" };

public IEnumerable<string> GetItems() {
foreach (var current in strings) {
yield return current;
}
}
}

关于c# - 为什么我的 IEnumerable UserControl 在我用 foreach 枚举它之后被处置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6428419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com