c# - 我应该使用“ref”通过引用方法来传递集合(例如列表)吗?

Posted

技术标签:

【中文标题】c# - 我应该使用“ref”通过引用方法来传递集合(例如列表)吗?【英文标题】:c# - should I use "ref" to pass a collection (e.g. List) by reference to a method? 【发布时间】:2011-03-29 06:18:43 【问题描述】:

我应该使用“ref”通过引用方法来传递列表变量吗?

答案是否不需要“ref”(因为列表将是一个参考变量),但是为了便于阅读,请将“ref”放入?

【问题讨论】:

[Passing By ref and out ](***.com/questions/1644372/passing-by-ref-and-out) 涵盖了类似的问题。 【参考方案1】:

不,除非您想更改变量引用的列表,否则不要使用 ref。如果您只想访问列表,请不要参考。

如果你创建一个参数 ref,你的意思是调用者应该期望他们传入的参数可以被分配给另一个对象。如果你不这样做,那么它就没有传达正确的信息。您应该假设所有 C# 开发人员都了解正在传入对象引用。

【讨论】:

【参考方案2】:

在你的场景中你不需要ref,它也不会帮助提高可读性。

ref 仅在您打算更改变量引用的内容而不是它引用的对象的内容时使用。这有意义吗?

【讨论】:

【参考方案3】:

字典是引用类型,因此不能按值传递,尽管对字典的引用是值。让我试着澄清一下:

void Method1(Dictionary<string, string> dict) 
    dict["a"] = "b";
    dict = new Dictionary<string, string>();


void Method2(ref Dictionary<string, string> dict) 
    dict["e"] = "f";
    dict = new Dictionary<string, string>();


public void Main() 
    var myDict = new Dictionary<string, string>();
    myDict["c"] = "d";

    Method1(myDict);
    Console.Write(myDict["a"]); // b
    Console.Write(myDict["c"]); // d

    Method2(ref myDict); // replaced with new blank dictionary
    Console.Write(myDict["a"]); // key runtime error
    Console.Write(myDict["e"]); // key runtime error

【讨论】:

以上是关于c# - 我应该使用“ref”通过引用方法来传递集合(例如列表)吗?的主要内容,如果未能解决你的问题,请参考以下文章

C#中关键字ref和out的区别

c# out ref

在 C# 中将 REF 和 OUT 关键字与按引用传递和按值传递一起使用

C#同样是引用,ref和out到底有什么区别?

为什么在C#中,引用型参数是隐式传递给函数的?

ref的使用