使用“ref”键将“引用类型”作为参数传递给方法是否有意义?

时间:2011-05-11 07:35:54

标签: c# .net methods parameters pass-by-reference

  

可能重复:
  C#: What is the use of “ref” for Reference-type variables?

您好,

使用“ref”键将“引用类型”作为参数传递给方法是否有意义?

或者它只是废话,因为它已经是引用类型而不是值类型?

谢谢!

7 个答案:

答案 0 :(得分:5)

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

如果您认为可以将变量指向方法中的其他对象(或null),那么这是有道理的。

否则,不。

答案 1 :(得分:3)

如果有所作为,因为它允许方法更改实例,您的变量指向

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

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"
}

答案 2 :(得分:3)

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

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

public void DoSomethingWithRef(ref string value) 
{
    value = "changed";
}

答案 3 :(得分:0)

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

查看此问题 - What is the use of "ref" for reference-type variables in C#? - 包括此示例

Foo foo = new Foo("1");

void Bar(ref Foo y)
{
    y = new Foo("2");
}

Bar(ref foo);
// foo.Name == "2"

答案 4 :(得分:0)

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

答案 5 :(得分:0)

这不是废话。当您这样做时,您将通过引用传递引用。

示例:

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

答案 6 :(得分:-1)

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

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将在调用网站处更改