4

As far as I know a string in C# is a reference type.

So in the following code 'a' should be equal to "Hi", but it still keeps its value which is "Hello". Why?

string a = "Hello";
string b = a;
b = "Hi";
3

5 Answers 5

29

A number of the answers point out that strings are immutable; though that is true, it is completely irrelevant to your question.

What is more relevant is that you are misunderstanding how references work with respect to variables. A reference is not a reference to a variable. Think of a reference as a piece of string. You start with this:

a----------------------Hello

Then you say that "b = a", which means attach another piece of string to the same thing that a is attached to:

a----------------------Hello
                      /
b---------------------

Then you say "now attach b to Hi"

a----------------------Hello

b----------------------Hi

You are thinking either that references work like this:

a----------------------Hello

Then I say that b is another name for a:

a/b ----------------------Hello

Then I change b, which changes a, because they are two names for the same thing:

a/b ----------------------Hi

Or perhaps you are thinking that references work like this:

a----------------------Hello

Then I say that b refers to a:

b -------------- a ----------------------Hello

Then I change b, which indirectly changes a:

b -------------- a ----------------------Hi

That is, you are expecting to make a reference to a variable, instead of a value. You can do that in C#, like this:

void M(ref int x)
{
    x = 1;
}
...
int y = 0;
M(ref y);

That means "for the duration of the call to M, x is another name for y". A change to x changes y because they are the same variable. Notice that the type of the variable need not be a reference type.

Sign up to request clarification or add additional context in comments.

Comments

7

The line b = "Hi"; changes which string b references. a still references "Hello".

string a = "Hello";  // Set a to reference the string "Hello"
string b = a;        // Set b to reference the same string as a
b = "Hi";            // Set b to reference the string "Hi"

Comments

1

You are changing the reference b. Not a. The reference itself is copied while the object remains untouched. So b = "Hi" copies a reference to the "Hi" object into b. This does not affect a.

Comments

1

The concept of a reference type is the most confusing thing amongst OOP programmers.

Run the below code, and you will be surprised to see the answer:

Create a simple Book class with a property called Name and write the below code in the Main method of the application.

Book a = new Book() {Name = "book a"};
Book b = new Book() {Name = "book b"};

Book c = a; //line 3

Book a = b; //Line 4

Console.WriteLine(c.Name);

And as no doubt you will expect the answer to be "book b" because of line 4. You think that as c is a and after that a became b which will also make c equals b.

Which is not the case!

Read the balloon anology at Ballon analogy for Reference type.

2 Comments

Ok, Replace Book with string in the example and check if you should have asked the same question or not ?
Ok, I didn't realize that this line (a="Hi") is like making the variable (a) refers to another object,I thought it is changing the object that the variable (a) is referring to.
0

NO!

What you did, is to create two references ('a','b') to a string "Hello". With b = "Hi" you change 'b' to reference the string "Hi".

'a' will never change this way.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.