将"reference type"作为带有键的参数传递给方法是否有意义'ref'?



可能的重复项:
C#:引用类型变量的"ref"有什么用?

你好

将"

引用类型"作为带有"ref"键的参数传递给方法是否有意义?

或者它只是无稽之谈,因为它已经是引用类型而不是值类型?

谢谢!

除了它指向的对象之外,它还允许您更改引用变量本身

如果您认为可以使变量指向方法中的不同对象(或null),这是有意义的。

否则,没有。

将引用类型作为 ref 传递时,将引用作为引用传递,这可能是有意义的。这意味着该方法可以替换引用,如果它希望:

public void CallRef()
{
    string value = "Hello, world";
    DoSomethingWithRef(ref value);
    // Value is now "changed".
}
public void DoSomethingWithRef(ref string value) 
{
    value = "changed";
}

If 会有所不同,因为它允许方法更改变量指向的实例。

换句话说,当您想要使变量指向引用类型的其他实例时,可以使用它。

private static void WithoutRef(string s)
{
    s = "abc";
}
private static void WithRef(ref string s)
{
    s = "abc";
}
private static void Main()
{
    string s = "123";
    WithoutRef(s);
    Console.WriteLine(s); // s remains "123"
    WithRef(ref s);
    Console.WriteLine(s); // s is now "abc"
}

C# 中的 ref 允许您修改实际变量。

看看这个问题 - 在 C# 中引用类型变量的"ref"有什么用? - 包括这个例子

Foo foo = new Foo("1");
void Bar(ref Foo y)
{
    y = new Foo("2");
}
Bar(ref foo);
// foo.Name == "2"
这不是

胡说八道。执行此操作时,您将通过引用传递引用。

例:

class X
{
     string y;
     void AssignString(ref string s)
    {
        s = "something";
    }
    void Z()
    {
        AssignString(ref this.y};
    }
}

如果您希望传入的传入变量更改其指针,则可以执行此操作。

请考虑以下代码。你期望这个程序的输出是什么?

string s = "hello world";
Console.WriteLine(s);
foo(s);
Console.WriteLine(s);
bar(ref s);
Console.WriteLine(s);
void foo(string x)
{
    x = "foo";
}
void bar(ref string x)
{
    x = "bar";
}

输出为:

hello world
hello world
bar

调用方法 bar 时,您将引用传递给字符串 s 引用(而不是按值),这意味着s将在调用站点更改。