Make a reference to another string in C#

前端 未结 5 758
夕颜
夕颜 2021-01-19 22:25

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?<

相关标签:
5条回答
  • 2021-01-19 22:31

    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.

    0 讨论(0)
  • 2021-01-19 22:36

    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.

    0 讨论(0)
  • 2021-01-19 22:40

    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.

    0 讨论(0)
  • 2021-01-19 22:48

    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.

    0 讨论(0)
  • 2021-01-19 22:52

    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"
    
    0 讨论(0)
提交回复
热议问题