Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组或列表在c#中是否默认通过引用传递?_C#_Arrays_Reference - Fatal编程技术网

数组或列表在c#中是否默认通过引用传递?

数组或列表在c#中是否默认通过引用传递?,c#,arrays,reference,C#,Arrays,Reference,是吗?或者为了加速我的程序,我应该通过引用传递它们吗?是的,它们在C#中默认通过引用传递。C#中的所有对象都是,值类型除外。更准确地说,它们是“按值引用”传递的;也就是说,在方法中看到的变量值是对传递的原始对象的引用。这是一个很小的语义点,但有时可能很重要。它们是按值传递的(就像所有既不是ref也不是out的参数一样),但值是对对象的引用,因此它们实际上是按引用传递的。引用是按值传递的 NET中的数组是堆上的对象,因此您有一个引用。该引用是通过值传递的,这意味着调用方将看到对数组的内容的更改,但

是吗?或者为了加速我的程序,我应该通过引用传递它们吗?

是的,它们在C#中默认通过引用传递。C#中的所有对象都是,值类型除外。更准确地说,它们是“按值引用”传递的;也就是说,在方法中看到的变量值是对传递的原始对象的引用。这是一个很小的语义点,但有时可能很重要。

它们是按值传递的(就像所有既不是ref也不是out的参数一样),但值是对对象的引用,因此它们实际上是按引用传递的。

引用是按值传递的

NET中的数组是堆上的对象,因此您有一个引用。该引用是通过值传递的,这意味着调用方将看到对数组的内容的更改,但是重新分配数组不会:

void Foo(int[] data) {
    data[0] = 1; // caller sees this
}
void Bar(int[] data) {
    data = new int[20]; // but not this
}
如果添加
ref
修饰符,则引用将通过引用传递,调用方将看到上面的任何更改。

(1)没有人明确回答OP的问题,因此:

  • 否。将数组或列表作为引用显式传递不会影响性能
  • 避免了OP担心会发生的情况,因为函数已经在引用上运行(该引用是通过值传递的)。上面的答案很好地解释了这意味着什么,为宜家提供了回答原始问题的方式
(2) 给大家的好建议:

  • 阅读Eric Lippert关于何时/如何进行优化的建议。过早优化是许多罪恶的根源
(3) 重要,但尚未提及:

  • 需要通过引用传递任何东西(值或引用)的用例很少
  • 这样做会给你额外的方法来打击你自己,这就是为什么C#让你在方法调用中也使用“ref”关键字的原因。较旧的(Java之前的)语言只让您在方法声明上指示通过引用传递。这引起了无数的问题。Java鼓吹它根本不允许您这么做

通过值传递引用;这与“它们是通过引用传递的”截然不同,这与事实恰恰相反。引用:“默认情况下,所有参数都是通过C#中的值传递的。如果显式包含out或ref修饰符,则仅通过引用传递参数。但是,需要注意的是,当参数的类型是引用类型时,传递的是引用,而不是实际的对象。”。只有引用(内存地址)通过值传递。要加快程序速度,您应该(1)设定有意义的目标,(2)测试是否达到目标,(3)如果没有达到目标,使用分析工具查找最慢的内容,以及(4)优化最慢的东西。也可以看这个@EricLippert。你的评论回答了OP的真实问题,远远好于任何发布的答案。每个人都被“按值传递引用”的技术细节分散了注意力,以至于完全忽略了性能优化的真正问题。不幸的是,OP传达他的需求相当糟糕,其他答案至少会帮助谷歌人群。“其他答案至少会帮助谷歌人群”-他们会的!)答案是正确的,但我对那些说“引用是通过值传递的”的人有一种憎恨。它混淆了这个问题。是的,引用(内存地址)是按值传递的,但这不是问题所在。@WernerVA我感兴趣的是,你认为如何用不同的方式来表达它,保持正确和明确,我不会用不同的方式来表达,只是可能需要更详细一点。这并不能回答问题的速度部分。您可能很清楚,与其他数百个成本更高的操作相比,优化参考副本将是完全可以忽略的,但OP确实明确提出了这一点。@Dan速度部分与“如果数组是按值传递的(表示数组内容的副本),则表示所有内存的分配和副本“。由于这是一个已传递的引用,因此没有性能问题需要回答-问题的这一部分将被视为无意义并自动回答。除了现在,这里的评论中也明确回答了这个问题。。。