0

我对 C#(来自 PHP)有点新,我有点震惊,通过循环遍历一个列表,我无法传递对该变量的引用,即以下代码无效:

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

我进行了一些研究,发现了一个创建“可更新枚举器”的建议,但我无法弄清楚我应该如何做到这一点。我遵循了一个示例,并尝试为 IEnumerator.Current 方法和我的自定义枚举器 (PeopleEnum.Current) 添加 Current 设置器,但老实说,这是盲目的猜测并且不起作用。我将整个代码粘贴在 pastebin 中,因为在这里粘贴很长 -自定义枚举器尝试。在此代码中,尝试通过以下方式访问当前元素

badClass baddie = new badClass(ref tmp.Current);

导致预期的错误“属性或索引器可能不会作为输出或引用参数传递”

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

4

3 回答 3

2

首先——不想责怪你——我想说:如果你学习一门新语言,那就学习新语言!并且不要尝试使用 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# 中有效,并且每个事件处理程序都将使用正确的对象。如果它不符合您的需求,您必须提供更多详细信息。

于 2011-07-30T13:42:54.823 回答
1

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

int sizeOfArray=objectArray.size();
for(int i=0;i<sizeOfArray;i++)
{
    obj=objectArray[i];
    // use obj whatever you wany
}
于 2011-07-30T13:30:01.907 回答
0

听起来您不是在尝试传递对 Object 的引用(Object 已经是引用类型),而是对 Object 在数组中的位置的引用,对吗?由于它管理内存和引用的方式,后者在 .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; }
    }
}

您现在可以构造它并传递它,以及传递对数组的多个引用所带来的所有相关复杂性风险。如果可能的话,最好更改设计以避免这种情况,但有可能完成您所追求的。

于 2011-07-30T13:42:30.383 回答