【问题标题】: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);
        }

它们指向的内存位置相同。该值仅在内存中保存一次。

如果将相同的字符串分配给其他变量,则从实习池中获取相同的引用并分配给字符串变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多