可能重复:
C#: What is the use of “ref” for Reference-type variables?
您好,
使用“ref”键将“引用类型”作为参数传递给方法是否有意义?
或者它只是废话,因为它已经是引用类型而不是值类型?
谢谢!
答案 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
将在调用网站处更改