Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Pointers in a Method's arguments?

I wish to directly modify a variable's value outside of a method from inside it.
Pointers are the way, correct?

How?

like image 585
Steffan Donal Avatar asked Sep 06 '10 18:09

Steffan Donal


4 Answers

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.

like image 102
LBushkin Avatar answered Sep 19 '22 17:09

LBushkin


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.

like image 40
Mark Byers Avatar answered Sep 18 '22 17:09

Mark Byers


Pointers are the way, correct?

Not in C# they're not. Use ref parameters:

 void Times2(ref int a) { a = a * 2; }

 void Foo()
 {
      int x = 1;
      Times2(ref x);
      // x is now 2 
 }
like image 44
Henk Holterman Avatar answered Sep 21 '22 17:09

Henk Holterman


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.

like image 21
Brian Rasmussen Avatar answered Sep 21 '22 17:09

Brian Rasmussen