Search code examples
c#stringvalue-typereference-type

Make a reference to another string in C#


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";

Solution

  • 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.