Do they? Or to speed up my program should I pass them by reference?
-
40To speed up your program you should (1) set meaningful goals, (2) test to see if you've met your goals, (3) if you haven't, use a profiling tool to find the slowest thing, and (4) optimize the slowest thing.Eric Lippert– Eric Lippert2009-06-08 23:42:34 +00:00Commented Jun 8, 2009 at 23:42
-
1See this also stackoverflow.com/q/4311226/344822prabhakaran– prabhakaran2014-03-04 09:08:10 +00:00Commented Mar 4, 2014 at 9:08
-
4@EricLippert Your comment answers the OP's real question far better than any of the posted answers. Everyone was so distracted by the "pass reference by value" technicalities that they completely overlooked the real question about performance optimization. Unfortunately the OP communicated his needs rather poorly, and the other answers will at least help the Google crowd.Dan Bechard– Dan Bechard2015-09-03 17:44:02 +00:00Commented Sep 3, 2015 at 17:44
-
1"other answers will at least help the Google crowd" - they will! :)miki– miki2016-11-02 14:07:01 +00:00Commented Nov 2, 2016 at 14:07
4 Answers
The reference is passed by value.
Arrays in .NET are object on the heap, so you have a reference. That reference is passed by value, meaning that changes to the contents of the array will be seen by the caller, but reassigning the array won't:
void Foo(int[] data) {
data[0] = 1; // caller sees this
}
void Bar(int[] data) {
data = new int[20]; // but not this
}
If you add the ref modifier, the reference is passed by reference - and the caller would see either change above.
7 Comments
(1) No one explicitly answered the OP's question, so here goes:
- No. Explicitly passing the array or list as a reference will not affect performance.
- What the OP feared might be happening is avoided because the function is already operating on a reference (which was passed by value). The top answer nicely explains what this means, giving an Ikea way to answer the original question.
(2) Good advice for everyone:
- Read Eric Lippert's advice on when/how to approach optimization. Premature optimization is the root of much evil.
(3) Important, not already mentioned:
- Use cases that require passing anything - values or references - by reference are rare.
- Doing so gives you extra ways to shoot yourself in the foot, which is why C# makes you use the "ref" keyword on the method call as well. Older (pre-Java) languages only made you indicate pass-by-reference on the method declaration. And this invited no end of problems. Java touts the fact that it doesn't let you do it at all.
Comments
Yes, they are passed by reference by default in C#. All objects in C# are, except for value types. To be a little bit more precise, they're passed "by reference by value"; that is, the value of the variable that you see in your methods is a reference to the original object passed. This is a small semantic point, but one that can sometimes be important.