数组或列表在c#中是否默认通过引用传递?
是吗?或者为了加速我的程序,我应该通过引用传递它们吗?是的,它们在C#中默认通过引用传递。C#中的所有对象都是,值类型除外。更准确地说,它们是“按值引用”传递的;也就是说,在方法中看到的变量值是对传递的原始对象的引用。这是一个很小的语义点,但有时可能很重要。它们是按值传递的(就像所有既不是ref也不是out的参数一样),但值是对对象的引用,因此它们实际上是按引用传递的。引用是按值传递的 NET中的数组是堆上的对象,因此您有一个引用。该引用是通过值传递的,这意味着调用方将看到对数组的内容的更改,但是重新分配数组不会:数组或列表在c#中是否默认通过引用传递?,c#,arrays,reference,C#,Arrays,Reference,是吗?或者为了加速我的程序,我应该通过引用传递它们吗?是的,它们在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担心会发生的情况,因为函数已经在引用上运行(该引用是通过值传递的)。上面的答案很好地解释了这意味着什么,为宜家提供了回答原始问题的方式
- 阅读Eric Lippert关于何时/如何进行优化的建议。过早优化是许多罪恶的根源
- 需要通过引用传递任何东西(值或引用)的用例很少
- 这样做会给你额外的方法来打击你自己,这就是为什么C#让你在方法调用中也使用“ref”关键字的原因。较旧的(Java之前的)语言只让您在方法声明上指示通过引用传递。这引起了无数的问题。Java鼓吹它根本不允许您这么做