gpt4 book ai didi

c# - 何时传递 ref 关键字

转载 作者:太空狗 更新时间:2023-10-29 17:50:07 25 4
gpt4 key购买 nike

我已经了解了 passng 和不传递 ref 参数之间的区别,但是,我什么时候想使用它们?

例如,我在一个方法中有一些逻辑可以重构到它自己的方法中。 Resharper 4.5 将其中一个参数设为 ref 类型,但我认为如果手动进行重构,我不会这样做。

显然我缺少一些理解。也许当某些类型或某些场景在编码中错过 ref 关键字时会发生什么的例子会有所帮助?

谢谢

最佳答案

让我把它分解成两个问题:

1) 编写方法时什么时候应该使用 ref/out 形式参数声明?

当您希望您的方法能够读取和写入从调用方传入的变量,而不是仅仅读取时,请使用 ref/out。 p>

2) 为什么“提取方法”重构会产生 ref 参数?

我不知道Resharper的细节,但我可以猜一猜。考虑以下邪恶的可变值类型:

struct S 
{
private int x;
public int X() { return this.x; }
public void M() { this.x += 1; }
}

你有一个方法:

void Foo() 
{
S s = new S();
Fred(s);
Blah(s);
Bar(s);
s.M();
Console.WriteLine(s.X()); // prints 1
}

然后你在中间位执行“提取方法”:

void NewMethod(ref S s)
{
Blah(s);
Bar(s);
s.M();
}

void Foo()
{
S s = new S();
Fred(s);
NewMethod(ref s);
Console.WriteLine(s.X()); // still prints 1
}

如果您创建了一个没有“ref”的方法,那么调用 NewMethod(s) 会将 s 的副本传递给 NewMethod。请记住,值类型是按值复制的;这就是为什么我们称它们为“值类型”。这将是发生变异的副本,然后 s.X() 返回零。重构在程序中引入语义变化是一个坏主意,重构引擎很难知道给定方法是否依赖于值类型的可变性。

这只是您应该避免使用可变值类型的另一个原因。

关于c# - 何时传递 ref 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2193064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com