可能是重复问题:
C#:什么是用于引用类型变量的“ref”?
嗨,
将“引用类型”作为带有'ref'关键字的参数传递给方法是否有意义?
还是这只是一种无意义的做法,因为它已经是一个引用类型而不是值类型?
谢谢!
可能是重复问题:
C#:什么是用于引用类型变量的“ref”?
嗨,
将“引用类型”作为带有'ref'关键字的参数传递给方法是否有意义?
还是这只是一种无意义的做法,因为它已经是一个引用类型而不是值类型?
谢谢!
如果您认为您可能在方法内部使变量指向不同的对象(或null
),那么这是有意义的。
否则,没有必要。
如果使用它,会有所不同,因为它允许该方法更改您的变量指向的实例。
换句话说,当您想要使您的变量指向引用类型的不同实例时,使用它。
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"
}
当使用ref关键字传递引用类型时,你将以引用的形式传递该引用,这是有意义的。这意味着,如果方法希望,它可以替换该引用:
public void CallRef()
{
string value = "Hello, world";
DoSomethingWithRef(ref value);
// Value is now "changed".
}
public void DoSomethingWithRef(ref string value)
{
value = "changed";
}
如果你想要传入的变量指针被改变,那么就需要这样做。
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
将在调用站点发生更改。