c# -如何创建可更新的枚举器

本文关键字:可更新 枚举 创建 何创建 | 更新日期: 2023-09-27 18:03:56

我对c#有点陌生(来自PHP),我有点震惊,通过循环列表,我不能传递对该变量的引用,即以下代码无效:

foreach (ref string var in arr) {
    var = "new value";
}

我研究了一下,我发现了一个建议,创建一个"可更新的枚举器",但我不知道我应该怎么做。我遵循了一个示例,并试图为IEnumerator添加当前的setter。当前方法和我的自定义枚举器(peopleenumt .Current),但是,说实话,这是盲目的猜测,没有工作。我将整个代码粘贴到pastebin,因为粘贴在这里很长-尝试自定义枚举器。在这段代码中,试图通过

访问当前元素
badClass baddie = new badClass(ref tmp.Current);

导致预期错误"属性或索引器可能无法作为out或ref参数传递"

我的目标是在最后做的是这样的东西-通过对象列表,为每个对象生成一个按钮,并为该按钮添加一个onclick事件,该按钮将打开一个新表单,传递该对象的引用,以便其内容可以在新表单中编辑。我做了所有这些,但是传递对象作为引用,而不是只读数据,这让我很难受。我将感谢任何答案,链接,我可以阅读更新的枚举或想法。

c# -如何创建可更新的枚举器

首先,我想说:如果你学习一门新语言,那就学习它!不要尝试使用c#开发PHP。如果所有的计算机语言都是一样的,我们就不会有这么多计算机语言了。: -)

我不明白你的例子与你想做的实际工作有什么关系,但是你应该首先学习事件、委托和LINQ。可能会有这样的帮助:

foreach (Obj obj in yourBaseObjects) {
    Obj localObj = obj; // See Dans comment!!!
    Button button = new Button(); // however you create your buttons
    button.Click += {
         // do something with obj
         Console.WriteLine(localObj);
    }
}

是的,这在c#中工作,每个事件处理程序将使用正确的对象。如果不符合你的需要,你必须提供更多的细节。

为什么使用foreach循环。使用for循环。我不知道确切的代码/语法,但类似这样:

int sizeOfArray=objectArray.size();
for(int i=0;i<sizeOfArray;i++)
{
    obj=objectArray[i];
    // use obj whatever you wany
}

听起来您不是试图传递对对象的引用(对象已经是引用类型),而是对对象在数组中的位置的引用,对吗?由于. net管理内存和引用的方式,后者在。net中不可能直接实现。您可以使用包装器类完成类似的工作(没有错误处理,但这是基本思想):

public sealed class ListReference<T>
{
    private readonly IList<T> _list;
    private readonly int _index;
    public ListReference(IList<T> list, int index)
    {
        _list = list;
        _index = index;
    }
    public T Value
    {
        get { return _list[_index]; }
        set { _list[_index] = value; }
    }
}

现在可以构造它并传递它,而不考虑传递对数组的多个引用所带来的所有相关复杂性风险。如果可能的话,最好改变设计来避免这种情况,但也有可能达到你想要的效果。