【问题标题】:C# passing List parameterC# 传递 List 参数
【发布时间】:2014-04-16 20:49:07
【问题描述】:

如果我正在编写一个接受两个列表参数的方法,如下所示:

public void ModifyYourListsHere(List<MyClass1> list1, List<MyClass2> list2)
{
    ...add and remove from the lists
}

如果我希望调用者了解列表将被修改,我应该将这些作为refout 传递吗?还是我只需要记录方法?或者用户应该期望他们可能会被修改?

【问题讨论】:

  • 既然你传递的是一个 List 而不是一个普通的 IEnumerable,你告诉调用者你需要 List 提供的那些函数,否则你为什么需要一个 List 作为参数。
  • 我认为你能做的最多就是为你的方法命名好:)(当然:记录它)
  • Passing By ref and out 的可能重复项

标签: c#


【解决方案1】:

您绝对不想使用out,因为这意味着您将在离开方法之前分配变量(编译器实际上会强制执行此操作)。

ref 将允许您重新分配传入的参数(这肯定会让用户感到困惑)。你几乎肯定也不想使用它。

最好的方法是首先选择一个好的方法名称,使一个或两个列表的内容很明显将被修改。然后使用 /// cmets 以便函数的用户可以在 Intellisense 中看到更详细的描述。

如果您有兴趣,请参阅 refout 的 MSDN 文档

【讨论】:

  • ref 肯定会做某事,但我同意它所做的与这个问题无关。将ref 与引用类型参数一起使用是完全合法且有用的。
  • @LasseV.Karlsen,您发帖时正在查看 MSDN。已更新以修复,如果我遗漏了什么,请告诉我。再次感谢!
  • 最好修复它,因为我红了两次以理解您为什么说ref 无关紧要。
  • @Inanikian,我还有什么遗漏的吗?我不确定我是否理解您的评论。
  • @Servy:ref 不能在这里使用吗?
【解决方案2】:

如果函数可能改变变量指向的列表并且调用者应该引用新列表,则使用 ref。

如果函数返回一个调用者在调用之前没有引用的新列表,则使用 out。这应该只在函数需要返回多个值时使用。

如果 List 在函数调用之前始终存在,则不应使用 refout

如果您的函数修改了它作为参数接收的对象,请务必做好记录!

【讨论】:

    【解决方案3】:

    如果你想修改第一个列表,那么你必须使用ref关键字,调用者会知道他必须在列表之前使用ref,否则该方法将被一条红线下划线表示有一个错误。

    更新

    您还可以使用 ref 关键字来传递引用类型。通过引用传递引用类型使被调用的方法能够修改引用参数所引用的对象。对象的存储位置作为引用参数的值传递给方法。如果更改参数的存储位置,则会更改基础参数的存储位置。来源:MSDN

    【讨论】:

    • 您不需要使用ref 关键字来改变列表。
    • Servy 是正确的,您不需要使用ref 来修改传入的列表。列表本身是对象引用列表,而不是实际对象本身。所以通过引用传递列表只会传递对引用列表的引用。通过 ref 传递将允许该列表本身被重新分配,而不是它包含的项目。
    猜你喜欢
    • 1970-01-01
    • 2015-11-20
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多