This article mainly introduces the special string type of C#. It has a very good reference value. Let’s take a look at it with the editor.
1. Preface
String is a reference type. Everyone knows this, right? But in the process of using it, I find that it still has some characteristics of value types. Why is this?
The reason is that .Net considers that if a large number of string objects are manipulated, and a large number of reference objects are manipulated, the performance will definitely not be as fast as the value type. In order to improve this performance, .Net provides a special solution: string resident pool!
2. Text
Let us look at a piece of code first:
string str1 = "aa"; string str2 = "a" + "a"; Console.WriteLine(ReferenceEquals(str1, str2)); //print:true
This str1 The memory address pointed to by str2 is actually exactly the same!
The reason is that .Net maintains a Hash table inside the CLR (actually the string resident pool mentioned above), the key is the string content, and the value is the address of the managed heap pointed to; when initialized to create When a new string is created, .Net will search the Hash table to see if there is the same value. If the key is the same, the address value of the existing string will be assigned to the newly created string. If not, the address value of the existing string will be assigned to the newly created string. If it exists, the address will be reallocated, which is why the memory of the above code is true.
Let us look at another piece of code:
string str3 = "ab"; string str4 = "a"; str4 += "b"; Console.WriteLine(ReferenceEquals(str3, str4));//print :false
The reason why false appears, please pay attention to the keyword "initialization" in the previous column Create", when the string is dynamically created, .Net will not search the Hash table to see if it has been created, but create it directly;
If you want to optimize the above code and improve the performance (xian) high (de) pursuit (dan) seeking (teng), we can manually add this string to the string resident pool for comparison
string str3 = "ab"; string str4 = "a"; str4 += "b"; str4 = string.Intern(str4);//Intern:它会去字符串驻留池中搜索,假如找寻到的话则返回对应的地址 Console.WriteLine(ReferenceEquals(str3, str4));//print :true
3. Summary
Finally draw some conclusions about string:
1. String is not created using the newobj command in clr, but Created with the ldstr command! Moreover, string has the characteristics of a value type, but it is a reference type in memory and exists on the managed heap;
2. string is sealed, so it cannot be subtracted Class integration;
3. When the created content is the same, the string points to the same address, and each operation on the string will generate a new address (string Constancy);
4. For a large number of splicing, use StringBuilder. It is dynamic and unlike string which is constant, but it is more expensive to create StringBuilder. , so using string for small splicing may be better in terms of performance!
The above is the detailed explanation of the special string type code examples in C#. For more related content, please pay attention to the PHP Chinese website (www. php.cn)!