Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why strings behave like ValueType

Tags:

string

c#

I was perplexed after executing this piece of code, where strings seems to behave as if they are value types. I am wondering whether the assignment operator is operating on values like equality operator for strings.

Here is the piece of code I did to test this behavior.

using System;

namespace RefTypeDelimma
{
    class Program
    {
        static void Main(string[] args)
        {
            string a1, a2;

            a1 = "ABC";
            a2 = a1; //This should assign a1 reference to a2
            a2 = "XYZ";  //I expect this should change the a1 value to "XYZ"

            Console.WriteLine("a1:" + a1 + ", a2:" + a2);//Outputs a1:ABC, a2:XYZ
            //Expected: a1:XYZ, a2:XYZ (as string being a ref type)

            Proc(a2); //Altering values of ref types inside a procedure 
                      //should reflect in the variable thats being passed into

            Console.WriteLine("a1: " + a1 + ", a2: " + a2); //Outputs a1:ABC, a2:XYZ
            //Expected: a1:NEW_VAL, a2:NEW_VAL (as string being a ref type)
        }

        static void Proc(string Val)
        {
            Val = "NEW_VAL";
        }
    }
}

In the above code if I use a custom classes instead of strings, I am getting the expected behavior. I doubt is this something to do with the string immutability?

welcoming expert views on this.

like image 819
AbrahamJP Avatar asked May 26 '10 09:05

AbrahamJP


People also ask

Why string is reference datatype?

String is a reference type, but it is immutable. It means once we assigned a value, it cannot be changed. If we change a string value, then the compiler creates a new string object in the memory and point a variable to the new memory location.

Why string is a reference type in Java?

Strings are Reference/Complex Object Type It means, since the string variable holds the reference to the actual data, so it passes this reference and not the actual data.

Why are strings immutable C#?

Why should you use immutable strings? One advantage is that they are thread safe. If you are working with a multi threaded system, there will be no risk of a deadlock or any concurrency issues, since when you modify a string, you are really just creating a new object in memory.

Is string a type C#?

A string is an object of type String whose value is text. Internally, the text is stored as a sequential read-only collection of Char objects. There's no null-terminating character at the end of a C# string; therefore a C# string can contain any number of embedded null characters ('\0').


1 Answers

You're not changing anything about the object a1 points to, but instead changing which object a1 points to.

a = new Person(); b = a; b = new Person();
(source: morethannothing.co.uk)

Your example replaces "new Person { … }" with a string literal, but the principle is the same.

The difference comes when you're changing properties of the object. Change the property of a value type, and it's not reflected in the original.

a = new Person(); b = a; b.Name = …;
(source: morethannothing.co.uk)

Change the property of a reference type, and it is reflected in the original.

a = new Person(); b = a; b.Name = …;

p.s. Sorry about the size of the images, they're just from something I had lying around. You can see the full set at http://dev.morethannothing.co.uk/valuevsreference/, which covers value types, reference types, and passing value types by value and by reference, and passing reference types by value and by reference.

like image 188
ICR Avatar answered Sep 19 '22 02:09

ICR