In C#, I have always thought that non-primitive variables were passed by reference and primitive values passed by value.
So when passing to a method any non-primitive object, anything done to the object in the method would effect the object being passed. (C# 101 stuff)
However, I have noticed that when I pass a System.Drawing.Image object, that this does not seem to be the case? If I pass a system.drawing.image object to another method, and load an image onto that object, then let that method go out of scope and go back to the calling method, that image is not loaded on the original object?
Why is this?
Objects aren’t passed at all. By default, the argument is evaluated and its value is passed, by value, as the initial value of the parameter of the method you’re calling. Now the important point is that the value is a reference for reference types – a way of getting to an object (or null). Changes to that object will be visible from the caller. However, changing the value of the parameter to refer to a different object will not be visible when you’re using pass by value, which is the default for all types.
If you want to use pass-by-reference, you must use
outorref, whether the parameter type is a value type or a reference type. In that case, effectively the variable itself is passed by reference, so the parameter uses the same storage location as the argument – and changes to the parameter itself are seen by the caller.So:
I have an article which goes into a lot more detail in this. Basically, “pass by reference” doesn’t mean what you think it means.