将“引用类型”作为带有“ref”键的参数传递给方法是否有意义
本文关键字:引用类型 参数传递 方法 有意义 是否 ref | 更新日期: 2023-09-27 17:55:54
可能的重复项:
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
将在调用站点更改。