By default (in C#), passing an object to a function actually passes a copy of the reference to that object. Changing the parameter itself only changes the value in the parameter, and not the variable that was specified.
void Test1(string param)
{
param = "new value";
}
string s1 = "initial value";
Test1(s1);
// s1 == "initial value"
Using out
or ref
passes a reference to the variable specified in the call to the function. Any changes to the value of an out
or ref
parameter will be passed back to the caller.
Both out
and ref
behave identically except for one slight difference: ref
parameters are required to be initialised before calling, while out
parameters can be uninitialised. By extension, ref
parameters are guaranteed to be initialised at the start of the method, while out
parameters are treated as uninitialised.
void Test2(ref string param)
{
param = "new value";
}
void Test3(out string param)
{
// Use of param here will not compile
param = "another value";
}
string s2 = "initial value";
string s3;
Test2(ref s2);
// s2 == "new value"
// Test2(ref s3); // Passing ref s3 will not compile
Test3(out s2);
// s2 == "another value"
Test3(out s3);
// s3 == "another value"
Edit: As dp points out, the difference between out
and ref
is only enforced by the C# compiler, not by the CLR. As far as I know, VB has no equivalent for out
and implements ref
(as ByRef
) only, matching the support of the CLR.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…