Domanda

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";
È stato utile?

Soluzione

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.

Altri suggerimenti

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"

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.

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.

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top