Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
As we all know String is a reference type in Dotnet and what we dont know is how it will effectively manages Memory by using Flyweight Pattern for String.Intern() method .
What is exactly Flyweight pattern do ?
1) Reduce Storage Costs for Large number of objects
2) share objects to be used in Multiple contexts simultaneously , but still maintains object oriented granularity and flexibility .
Suppose there is a requirement to implement "BRICK" class for building an Apartment, there might involve many Bricks During Construction . Here generally, user end up Creating milions of Brick Objects for building single room and this has to be repeated in building entire Apartment . [ though different sizes of bricks may be used ] .
Here complexity increases in creating more number of similar objects , flyweight pattern comes to rescue at this position .
Using FlyWeight pattern, group of shared objects are replaced by few shared objects once Extrinsic State[ like brick dimensions ] is removed . Dividing the states and seperating them into intrinsic and extrinsic state is important in flyweight pattern . this will improve performance and reduces complexity and memory footprint.
To give you more details , let us consider a small example on this
Case 1 :
consider 2 strings
String s1= "Santhosh" ;
String s2= s1 ; // as we know strings are reference type so both s1 and s2 will be pointing to the same address location
Console.WriteLine( ReferenceEquals(s1,s2)); // returns True .
Case 2 :
consider
String s1= "Santhosh" ;
String s2= "Santhosh" ;
Console.WriteLine( ReferenceEquals(s1,s2)); // returns True, reason being dotnet runtime maintains an INTERN pool, contains single reference to each unique string in the program .
Case 3 :
consider
String s1= "Santhosh" ;
String s2= Console.ReadLine()
Console.WriteLine( ReferenceEquals(s1,s2)); // returns False.
Here .net runtime by default doesnt replace runtime input with shared reference . In order to check use
string s2= String.Intern(Console.ReadLine() );
now the output will be true .