2010-08-17 66 views
6

可能重复:
Pass by value vs Pass by reference performance C#.net
通过引用传递值是否显着提高了速度?

有没有人已经测试,如果通过引用传递参数是显著不仅仅是复制他们更快?

但问题的主要焦点是:使用ref关键字是否存在任何缺点,而不使用它?

+0

看看这个主题:http://stackoverflow.com/questions/408101/which-is-faster-byval-or-byref – MUG4N 2016-10-17 17:37:49

+0

这是旧的工具,但感谢 – 2016-10-17 18:36:39

回答

14

不,它并没有显着提高速度,或者什么都没有。相反,通过使用ref关键字,您可以添加另一个间接级别,只会使代码变慢。

参数通常按值传递,这意味着它们被复制。对于简单的值,如int,它只是意味着该值的一个副本放在堆栈上。

对于像string这样的引用类型,这意味着将引用的副本放置在堆栈上。所以,这并不意味着整个对象被复制,它只是对被复制的对象的引用。

除非有特殊理由,否则通常不应使用refout关键字。

+1

一个小挑剔:如果你有一个*大的* struct然后通过ref传递它可能会略微提高性能。话虽如此,如果你的结构如此之大以至于通过val来显着地影响性能,那么你应该认真思考重构类型本身,而不是*关于通过ref传递它。 – LukeH 2010-08-17 12:08:28

+0

我不明白,如果只使用'string'参数传递引用,那么当更改传递的参数时原始变量不会被改变吗?内存中必须有一个新的字符串副本(或者我错了吗?)。如果我正在处理(或解析,但不能改变)真正的大字符串,那么通过'ref'传递它不会更快吗?谢谢你的解释:)。 – Buksy 2014-01-03 14:06:12

+0

@Buksy:值传递的引用类型(如字符串)的参数表示传递该引用的副本。如果更改参数,则不会影响原始参考。另一个因素是字符串是不可变的,所以你永远不能改变原始字符串。如果通过引用发送字符串参数,则可以更改原始引用,使其指向不同的字符串对象。由于字符串是不可变的,它们不需要被复制以确保方法不能改变它们,这使得通过值传递字符串变得高效。 – Guffa 2014-01-03 14:41:59

3

有值类型和在C#

在引用类型的情况下引用类型,使它们不ref关键字意味着通过引用。我没有对它进行测试,但我希望编译器和.NET框架的实现者尽可能快地通过它们。我无法想象通过引用这些引用比首先传递引用更快。这没有意义。

在价值类型的情况下,这是另一回事。如果一个结构很大,那么复制它肯定是很昂贵的,并且传递参考应该更快。但价值类型是有原因的价值类型。如果你有一个值类型你很关心把它传递给函数的效率,很可能你犯了一个错误使它成为一个值类型。