C#ref关键字用法

Cia*_*oma 12 c#

我理解(或者至少我相信我这样做)将类的实例传递给方法ref而不是传递方法意味着什么ref.何时或在什么情况下应该通过类实例refref在类实例中使用关键字时是否有最佳实践?

wom*_*omp 18

我输出和参数参数的最清楚的解释是...... Jon Skeet.

参数在C#中传递

他没有进入"最佳实践",但如果你理解他给出的例子,你就会知道什么时候需要使用它们.

  • 毫无疑问,乔恩·斯凯特(Jon Skeet)在他的网站上做了完美的解释,但是这个答案不过是一个链接,因此,当链接后面的网站出现故障时,它将变得毫无用处。 (2认同)

Y. *_*ham 11

当您可以替换原始对象时,您应该将其作为ref.如果它仅用于输出,并且在调用函数之前可以未初始化,那么您将使用out.


Ada*_*son 6

简而言之,ref如果您希望调用的函数能够更改该变量的值,则可以将值作为参数传递.

这与将引用类型作为参数传递给函数不同.在这些情况下,您仍然按值传递,但该值参考.在传递的情况下ref,然后发送对变量的实际引用; 实质上,你和你正在调用的函数"共享"相同的变量.

考虑以下:

public void Foo(ref int bar)
{
    bar = 5;
}

...

int baz = 2;

Foo(ref baz);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,baz变量的值为5,因为它是通过引用传递的.语义对于值类型是完全清楚的,但对于引用类型不是很清楚.

public class MyClass
{
    public int PropName { get; set; }
}

public void Foo(MyClass bar)
{
    bar.PropName = 5;
}

...

MyClass baz = new MyClass();

baz.PropName = 2;

Foo(baz);
Run Code Online (Sandbox Code Playgroud)

正如所料,baz.PropName将是5,因为MyClass是参考类型.但是,我们这样做:

public void Foo(MyClass bar)
{
    bar = new MyClass();

    bar.PropName = 5;
}
Run Code Online (Sandbox Code Playgroud)

使用相同的调用代码,baz.PropName将保留2.这是因为即使MyClass是引用类型,Foo也有自己的变量bar; bar并且baz刚开始时使用相同的值,但是一旦Foo分配了新值,它们就只是两个不同的变量.但是,如果我们这样做:

public void Foo(ref MyClass bar)
{
    bar = new MyClass();

    bar.PropName = 5;
}

...

MyClass baz = new MyClass();

baz.PropName = 2;

Foo(ref baz);
Run Code Online (Sandbox Code Playgroud)

我们最终PropName得到5,因为我们通过baz引用传递,使两个函数"共享"相同的变量.