【问题标题】:How does .Net saves string variables whose value is same?.Net如何保存值相同的字符串变量?
【发布时间】:2020-04-10 21:18:14
【问题描述】:
.Net如何保存值相同的字符串变量?例如,
string str1 = “xyz”;
string str2 = “xyz”;
另一种情况是,
string str1 = str2 = str3 = “xyz”;
它们是否会有一个内存位置或两个不同的内存位置?
我在最近的一次采访中被问及一个问题。根据我的理解,我回答说,当值相同时,将分配给该值的单个内存,并且 str1 和 str2 都将指向该内存位置。问题中提到的第二种情况也会发生同样的情况。但是,面试官并不相信。有人对此有什么想法吗?
【问题讨论】:
标签:
c#
asp.net
.net
string
memory-management
【解决方案1】:
它们两个或两个是否会有一个内存位置
不同的内存位置?
不同的内存位置。 String 是一种引用类型,因此两个值都存储在某个地方。字符串是一个对象。
编译器可以选择优化字符串常量,但这称为字符串实习。在这种情况下,您仍然有 2 个引用,但它们指向同一个地址。
【解决方案2】:
由于 CLR 如何使用 Intern Pool 来处理重复的字符串值,因此只分配了一次内存。两个字符串的引用将相同。
使用-Object.ReferenceEquals(str1, str2);检查参考
如果您使用下面的代码来获取引用指向的内存位置,它将是相同的。
string myVar = "This is my string";
string myVar1 = myVar;
unsafe
{
TypedReference tr = __makeref(myVar);
IntPtr ptr = **(IntPtr**)(&tr);
TypedReference tr1 = __makeref(myVar1);
IntPtr ptr1 = **(IntPtr**)(&tr1);
Console.WriteLine(ptr);
Console.WriteLine(ptr1);
}
它们指向的内存位置相同。该值仅在内存中保存一次。
如果将相同的字符串分配给其他变量,则从实习池中获取相同的引用并分配给字符串变量。