在C#中使用'ref'关键字

Sai*_*bal 5 .net c#

可能重复:
为什么在传递Object时使用ref关键字?
何时传递ref关键字

C#中'ref'关键字的正确用法是什么?我相信这方面有很多讨论主题,但我不清楚的是:

  1. 如果要传入引用对象,是否需要ref关键字?我的意思是当你在堆中创建一个对象时,它并不总是通过引用传递.这是否必须明确标记为ref?

Kir*_*rst 22

使用ref意味着将引用传递给函数.

默认行为是函数接收对同一对象的新引用.这意味着如果更改引用的值(例如,将其设置为新对象),则不再指向原始源对象.当您通过使用时,ref更改引用的值会更改源引用 - 因为它们是相同的.

考虑一下:

public class Thing
{
    public string Property {get;set;}
}

public static void Go(Thing thing)
{
    thing = new Thing();
    thing.Property = "Changed";
}

public static void Go(ref Thing thing)
{
    thing = new Thing();
    thing.Property = "Changed";
}
Run Code Online (Sandbox Code Playgroud)

如果你跑了

var g = new Thing();

// this will not alter g
Go(g);

// this *will* alter g
Go(ref g);
Run Code Online (Sandbox Code Playgroud)

  • +1最后,一个正确的答案.把这样的问题打开很长时间是很危险的,因为那里有太多的错误信息.在这里使用除了downvote之外的东西真好. (3认同)

Eri*_*ert 15

这里的答案中有很多令人困惑的错误信息.理解这一点的最简单方法是放弃"ref"的意思是"通过引用".考虑它的一个更好的方法是"ref"意味着"我希望被叫方的这个形式参数成为调用方的特定变量的别名".

当你说

void M(ref int y) { y = 123; }
...
int x = 456;
M(ref x);
Run Code Online (Sandbox Code Playgroud)

也就是说"在调用M时,被调用方的正式参数y是调用者侧变量x的另一个名称".将123分配给y与将123分配给x完全相同,因为它们是相同的变量,具有两个名称的变量.

就这样.不要考虑引用类型或值类型或其他,不考虑通过引用传递或通过值传递.所有"ref"表示"暂时为此变量创建第二个名称".


归档时间:

查看次数:

3859 次

最近记录:

15 年 前