A parameter declared with a ref
modifier is a reference parameter. Unlike a value parameter, a reference parameter does not create a new storage location. Instead, a reference parameter represents the same storage location as the variable given as the argument in the method invocation.
When a formal parameter is a reference parameter, the corresponding argument in a method invocation must consist of the keyword ref
followed by a variable-reference (§5.4) of the same type as the formal parameter. A variable must be definitely assigned before it can be passed as a reference parameter.
Within a method, a reference parameter is always considered definitely assigned.
The example
class Test { static void Swap(ref int x, ref int y) { int temp = x; x = y; y = temp; } static void Main() { int i = 1, j = 2; Swap(ref i, ref j); Console.WriteLine("i = {0}, j = {1}", i, j); } }
produces the output
i = 2, j = 1
For the invocation of Swap
in Main
, x
represents i
and y
represents j
. Thus, the invocation has the effect of swapping the values of i
and j
.
In a method that takes reference parameters it is possible for multiple names to represent the same storage location. In the example
class A { string s; void F(ref string a, ref string b) { s = "One"; a = "Two"; b = "Three"; } void G() { F(ref s, ref s); } }
the invocation of F
in G
passes a reference to s
for both a
and b
. Thus, for that invocation, the names s
, a
, and b
all refer to the same storage location, and the three assignments all modify the instance field s
.