I wish to directly modify a variable's value outside of a method from inside it.
Pointers are the way, correct?
How?
I wish to directly modify a variable's value outside of a method from inside it.
Pointers are the way, correct?
How?
You can use the method parameter keyword ref:
void modifyFoo(ref int foo)
{
foo = 42;
}
Call like this:
int myFoo = 0;
modifyFoo(ref myFoo);
Console.WriteLine(myFoo);
Result:
42
From the documentation:
The ref method parameter keyword on a method parameter causes a method to refer to the same variable that was passed into the method. Any changes made to the parameter in the method will be reflected in that variable when control passes back to the calling method.
To use a ref parameter, the argument must explicitly be passed to the method as a ref argument. The value of a ref argument will be passed to the ref parameter.
Use ref
. E.g. Foo(ref int i)
will allow Foo
to change the value of i
via the reference to the caller's value.
No. In c# you can apply pass by reference semantics using the ref
or out
modifiers:
void Foo( ref string s, ref int x )
{
s = "Hello World"; // caller sees the change to s
x = 100; // caller sees the change to x
}
// or, alternatively...
void Bar( out string s )
{
s = "Hello World";
}
The difference between these two, is that with out
, the caller does not have to specify a value when calling the method, since it is required that the called method will assign a value before exiting.
In C#, "pointers" are something that you can only use in unsafe code. As in C or C++, pointers in C# allow you to refer to the location of a variable or an object. References, in C# are different - you shouldn't think of them as pointers - they are intended to be more opaque and provide a way to "refer" to a variable or object without necessarily implying that they indicate its location in memory.
With references, you can use special keywords (out
, ref
) to pass an alias to a variable. These are only available in the context of method calls - where the compiler can use information about the lifetime of the referents to make sure that the reference does not outlive the original variable being aliased.
If the value is a class, than it is already passed by reference, and nothing else is required, unless you need to assign the object to something, val = anotherobject
, then you need to use the ref or out keywords.
If it is a struct (int, float, long, double, etc), then you must use ref (if the object may or may not be changed) or out (if the object will be changed). You can have more than one argument in a method marked by ref or val.