dshi15
asked on
By Value or By reference C#
Expert,
I have basic question, I expect app Print 'Mary' as result, but it Print 'Mike", It looks result is changed, I didn't use word 'ref' in second call, but it treat like reference type. Could you explain why?
Thanks a lot.
I have basic question, I expect app Print 'Mary' as result, but it Print 'Mike", It looks result is changed, I didn't use word 'ref' in second call, but it treat like reference type. Could you explain why?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MyClass test = new MyClass();
//1
//test.strTest = "Mary";
//SomeFunction(ref test);
//Console.WriteLine(test.strTest);
//2
test.strTest = "Mary";
SomeFunction(test);
Console.WriteLine(test.strTest);
Console.Read();
}
//static void SomeFunction(ref MyClass inst)
//{
// inst.strTest = "Mike";
//}
static void SomeFunction(MyClass inst)
{
inst.strTest = "Mike";
}
}
public class MyClass
{
public string strTest;
}
}
Thanks a lot.
ASKER
Thank you, but could you explain more, I'm learner and I can understand the following code from Microsoft website,
I passed an object SomeFunction(test);
I'm confused.
class Program
{
static void Main(string[] args)
{
int arg;
// Passing by value.
// The value of arg in Main is not changed.
arg = 4;
squareVal(arg);
Console.WriteLine(arg);
// Output: 4
// Passing by reference.
// The value of arg in Main is changed.
arg = 4;
squareRef(ref arg);
Console.WriteLine(arg);
// Output: 16
}
static void squareVal(int valParameter)
{
valParameter *= valParameter;
}
// Passing by reference
static void squareRef(ref int refParameter)
{
refParameter *= refParameter;
}
}
I passed an object SomeFunction(test);
I'm confused.
ASKER
Got it, I missed this line
>>And yes, keep in mind, that objects are passed as referenced types :). In other words, you pass an address of your object to the method, therefore the original object is modified.
You mean use 'ref ' or not, no difference here?
>>And yes, keep in mind, that objects are passed as referenced types :). In other words, you pass an address of your object to the method, therefore the original object is modified.
You mean use 'ref ' or not, no difference here?
OK, it needs a bit more explanation. With value types its pretty easy. See my comments inline:
static void Main(string[] args)
{
int arg;
// Passing by value.
// The value of arg in Main is not changed.
arg = 4;
squareVal(arg);
//anarki comment: when passing by value, we create a COPY of original value and use it //inside the method; therefore, our original value is not changed - only COPY is changed!
Console.WriteLine(arg);
// Output: 4
// Passing by reference.
// The value of arg in Main is changed.
arg = 4;
// now we do not create a copy. We, roughly speaking, pass an address of the value in the //memory (aka "pointer"). And therefore if you make some operations with this arg number //- we change the original! And when print - we print altered original!
squareRef(ref arg);
Console.WriteLine(arg);
// Output: 16
}
Hope this is pretty clear. Let me few minutes to prepare an example for objects - it's a bit more complex :).
static void Main(string[] args)
{
int arg;
// Passing by value.
// The value of arg in Main is not changed.
arg = 4;
squareVal(arg);
//anarki comment: when passing by value, we create a COPY of original value and use it //inside the method; therefore, our original value is not changed - only COPY is changed!
Console.WriteLine(arg);
// Output: 4
// Passing by reference.
// The value of arg in Main is changed.
arg = 4;
// now we do not create a copy. We, roughly speaking, pass an address of the value in the //memory (aka "pointer"). And therefore if you make some operations with this arg number //- we change the original! And when print - we print altered original!
squareRef(ref arg);
Console.WriteLine(arg);
// Output: 16
}
Hope this is pretty clear. Let me few minutes to prepare an example for objects - it's a bit more complex :).
"...You mean use 'ref ' or not, no difference here?..."
There is difference but pretty subtle. I will write an example to explain.
There is difference but pretty subtle. I will write an example to explain.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thank you very much.
When you pass any string (Mary etc) to a method, you set instance string Mike. Then you print this instance string - and you see "Mike". That's it...
Specifically, this method alterates the string, and does not matter what value you set before:
Open in new window
And yes, keep in mind, that objects are passed as referenced types :). In other words, you pass an address of your object to the method, therefore the original object is modified.