Fading Coder

One Final Commit for the Last Sprint

Home > Tech > Content

Understanding String Immutability and Interning in C#

Tech May 14 1

In the C# language, the string type is a reference type. Unlike value types which are stored on the stack, string objects reside on the managed heap. Under normal reference type rules, assigning one variable to another typically means both variables point to the same memory address, and modifying one would reflect in the other. However, strings in .NET exhibit unique behavior due to a concept known as immutability.

Immutability and Asssignment

When you assign a string variable to another, both initially reference the same location in memory. However, because strings are immutable, any operation that appears to modify the string actually results in the creation of a completely new string object. The original object remains unchanged in memory until it is garbage collected.

using System;

class StringBehavior
{
   public static void Main()
   {
       string primary = "initial value";
       string referenceCopy = primary; 

       Console.WriteLine("Before modification:");
       Console.WriteLine($"primary: {primary}");
       Console.WriteLine($"referenceCopy: {referenceCopy}");

       // Re-assigning primary creates a new object
       primary = "new value";

       Console.WriteLine("\nAfter modification:");
       Console.WriteLine($"primary: {primary}");
       Console.WriteLine($"referenceCopy: {referenceCopy}");
   }
}

In the example above, even though referenceCopy was assigned from primary, changing primary does not affect referenceCopy. When primary is assigned "new value", the CLR allocates a new string object on the heap. primary now points to this new location, while referenceCopy continues to point to the original "initial value" object.

String Interning Mechanism

The Common Language Runtime (CLR) optimizes memory usage for strings through a technique called String Interning. The CLR maintains an internal table (often referred to as the inteern pool) which acts as a hash map of string literals.

string alpha = "data";
string beta = "data";

bool sameRef = object.ReferenceEquals(alpha, beta); // Returns true

When the JIT compiler processes the code, it identifies literal strings. For the first occurrence of "data", the CLR checks the intern pool. If it is not found, the CLR creates a new string object on the heap and adds a reference to it in the intern pool. For the second occurrence of the literal "data", the CLR finds the existing reference in the pool and assigns it to the variable beta. Consequently, both alpha and beta point to the exact same memory address.

Equality Comparison

C# provides multiple ways to compare strings. The Equals method in the String class is overridden to perform a value-based comparison rather than a reference-based comparison. There are three primary signatures for equality:

  • public override bool Equals(object obj)
  • public bool Equals(string value)
  • public static bool Equals(string a, string b)

The instance-based Equals methods compare the characters within the strings. The static Equals method performs an initial check to see if the references are identical; if they are, it returns true immediately without iterating through the individual characters, which provides a performance optimization.

Constructor Limitations

It is worth noting that unlike most reference types, you cannot instantiate a string from a literal using the new keyword (e.g., string s = new string("test"); is invalid). String object are typically created through literals, string-returning methods, or by passing a character array to the string constructor.

Tags: C#.NETstring

Related Articles

Understanding Strong and Weak References in Java

Strong References Strong reference are the most prevalent type of object referencing in Java. When an object has a strong reference pointing to it, the garbage collector will not reclaim its memory. F...

Comprehensive Guide to SSTI Explained with Payload Bypass Techniques

Introduction Server-Side Template Injection (SSTI) is a vulnerability in web applications where user input is improper handled within the template engine and executed on the server. This exploit can r...

Implement Image Upload Functionality for Django Integrated TinyMCE Editor

Django’s Admin panel is highly user-friendly, and pairing it with TinyMCE, an effective rich text editor, simplifies content management significantly. Combining the two is particular useful for bloggi...

Leave a Comment

Anonymous

◎Feel free to join the discussion and share your thoughts.