Home > Software design >  How does the out parameter work internally?
How does the out parameter work internally?

Time:08-24

class fff {
    public static void jjj(out int j) {
        j = 88;
    }
}

//Main method
 int jfjf;
 fff.jjj(out jfjf);

In my main method I declare the jfjf variable which is not initialized in the runtime so I was wondering when I pass jfjf as the out argument to my jjj(out int j) method, what does the int j in the method refer to since the jfjf is not initialized?
I would like to know how this works internally.

CodePudding user response:

Internally, the address of jfjf is passed to your method.

For a regular (non-out) int parameter, the parameter's value is passed to the method. For example, the first statement of the following code block

f(1);

void f(int i) {
   ...
}

compiles to the following CIL (sharplab):

IL_0000: ldc.i4.1   // Push the value 1 on the stack
IL_0001: call void Program::'<<Main>$>g__f|0_0'(int32) // Invoke the method

On the other hand, if we have an out parameter (sharplab):

f(out int i);

void f(out int i) {
    i = 0;
}

the address of i is passed to f:

IL_0000: ldloca.s 0  // Push the address of the local variable with index 0 on the stack
IL_0002: call void Program::'<<Main>$>g__f|0_0'(int32&)

When f assigns a value to i, the value is stored at the memory address provided by the calling method:

IL_0000: ldarg.0     // Push argument 0 (= i's address) on the stack
IL_0001: ldc.i4.0    // Push 0 (the value we want to assign) on the stack
IL_0002: stind.i4    // Pop the value and the address from the stack, and store the value at the address
IL_0003: ret
  • Related