Passing parameters to a function by Value and by Reference.
Pass by Value
When we pass the parameter to a function by value, the parameter value of the caller is copied to the function parameter. Consider the below Example:
private void PassByVal_X(int x)
testPassByVal = 10;
In the example, the caller passed the testPassByVal by value to the function PassByVal_X. The value of 10 from testPassByValue is copied to the parameter x.
Hence, the changes done on the variable x, inside the function not reflected back to the caller on the variable
Pass by Reference
When we pass the parameter to a function by reference, the reference to the actual value of the caller is copied to the function parameter. So, at the end there are two references pointing to the same value, one from the caller, and one from the function.
Have a look at the below example:
private void PassByRef_X(ref int x)
testPassByRef = 10;
1) In this Example, the variable
x and the variable
testPassByRef pointing to the same location where the value 10 is stored.
2) Note the usage of the
ref keyword. We are indicating the compiler that value is passed by reference.
3) Since the value is passed by reference, the increment of value
x in side the function is reflected back to the caller in the variable
4) When we are passing by reference, the variable should be initialized before passing it to a function. Otherwise, we do get compilation error.
Pass by Reference with OUT
When we pass the parameter by reference, the compiler expects that we should initialize it. If there is situation that value is declared outside the function, and the same variable will be assigned some value inside the function. In this case, we should go for Pass by reference, but, not with ref. Because, ref expects that the value should be initialized. The Out keyword is used in this situation.
Both ref and out are meaning that we are passing by reference. The only difference is for out, the variable is not required to be initialized before passing it as parameter.
Look at the below example:
private void PassByRefOut_X(out int x, int y)
x = y * y;
testPP.PassByRefOut_X(out testPassByRefOut, 10);
Note the usage
out keyword. It implies that the parameter is still treated as Pass By Reference. But, now we no need to initialize it and it must get assigned inside the function.
The behaviour is same as the previous exmple. That is eventhough x is calculated inside the function
PassByRefOut_X the calculated value reflected back on the variable