在一个列表中改变引用值

3

我正在将一个Entry类型的对象从Entry列表中传递到一个帮助函数中,该函数接受对Entry对象的引用:

for(int i = 0; i < entries.Count; i ++)
{
     Entry singleEntry = entries[i];
     bool success = Helper(ref singleEntry);
}

在辅助函数中,创建了一个新的 Entry 对象,我希望 entries [i] 引用新对象而不是旧对象,但只有 singleEntry 实际上被更改。我尝试了以下操作:
for(int i = 0; i < entries.Count; i ++)
{     
     bool success = Helper(ref entries[i]);
}

但是我遇到了一个错误:"属性或索引器不能作为 out 或 ref 参数传递"。
最终,我通过添加以下这行代码来改变 entries[i] 的值:
for(int i = 0; i < entries.Count; i ++)
{
     Entry singleEntry = entries[i];
     bool success = Helper(ref singleEntry);

     entries[i] = singleEntry;
}

在修改List中的引用时,是否有更优雅的解决方案?


3
你的解决方案(第三个代码示例)是正确的,请保持原样。 - Al Kepp
追求优雅是好的,但是在使用模糊命名的方法(Helper??)时,你的代码正在做一些奇怪的事情,我更担心我的代码可读性/可维护性而不是它的优雅。 - Theodor Zoulias
我完全同意它应该首先具有可读性。我的示例只是实际代码的修改后、简化了很多的版本,仅出于提问目的。 - bob
1个回答

0

你下面的代码部分是实现你想要的功能最好、最常被接受的方式。

 for(int i = 0; i < entries.Count; i ++)
 {
     Entry singleEntry = entries[i];
     bool success = Helper(ref singleEntry);
     entries[i] = singleEntry;
 }

你也可以使用C#的不安全部分(指针),但那会非常危险,被严重反对,而且我必须提醒一下,是不安全的。

OP说他们的辅助方法创建了一个新的“Entry”,而不是更新字段/属性。因此,在更改s之前将element = new Entry();更改一下,您会发现这样不起作用。 - juharr
@juharr 谢谢你让我知道了。我已经相应地编辑了我的答案。 - Cabbage Champion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接