String.Intern和String.IsInterned有什么区别?

3

MSDN称:

String.Intern检索系统对指定字符串的引用。

String.IsInterned检索指定字符串的引用。

我认为IsInterned应该返回一个bool值,表示指定的字符串是否被内部化了。这个想法正确吗?我是说,它至少不符合.net框架的命名约定。

我编写了以下代码:

    string s = "PK";
    string k = "PK";

    Console.WriteLine("s has hashcode " + s.GetHashCode());
    Console.WriteLine("k has hashcode " + k.GetHashCode());
    Console.WriteLine("PK Interned " + string.Intern("PK"));
    Console.WriteLine("PK IsInterned " + string.IsInterned("PK"));

输出结果如下:

输出为:

s 的哈希码为 -837830672

k 的哈希码为 -837830672

PK Interned PK

PK IsInterned PK

为什么 string.IsInterned("PK") 返回 "PK"?


1
如果您想了解有关字符串和内部化的详细信息,请参阅我对此问题的回答https://dev59.com/MXRC5IYBdhLWcg3wOOT1#372559 - Brian Rasmussen
2
名字非常类似布尔类型。也许这是“如果已经输入”的拼写错误。 - Greg
关于您的使用GetHashCode()方法的备注:请注意,System.String覆盖了GetHashCode()方法。因此,这样的方法调用不能用于检查实例是否可能不同。相反,包括一个using System.Runtime.CompilerServices;指令并使用RuntimeHelpers.GetHashCode(string)方法。以下是一个很好的例子:string s = "PK"; string t = 'P'.ToString() + "K"; Console.WriteLine("s has non-overridden hashcode " + RuntimeHelpers.GetHashCode(s)); Console.WriteLine("t has non-overridden hashcode " + RuntimeHelpers.GetHashCode(t)); - Jeppe Stig Nielsen
1个回答

19

String.Intern方法会将字符串进行内部化,如果该字符串尚未被内部化;而String.IsInterned方法则不会。

由于"PK"已经被内部化,因此IsInterned("PK")返回的是"PK"。它返回字符串而不是bool的原因是为了让您轻松获取对内部化字符串本身的引用(它可能与您传入的引用不同)。换句话说,它实际上同时返回了两个相关的信息——您可以轻松地模拟它返回bool

public static bool IsInternedBool(string text)
{
     return string.IsInterned(text) != null;
}

我同意命名不是很理想,但我不确定哪种更好:GetInterned也许是一个选择?

这里有一个例子来展示它们之间的区别-我不使用字符串字面量,以避免它们事先被interned:

using System;

class Test
{
    static void Main()
    {
        string first = new string(new[] {'x'});
        string second = new string(new[] {'y'});

        string.Intern(first); // Interns it
        Console.WriteLine(string.IsInterned(first) != null); // Check

        string.IsInterned(second); // Doesn't intern it
        Console.WriteLine(string.IsInterned(second) != null); // Check
    }
}

4
默认情况下,所有字面字符串都会被池化。 - Brian Rasmussen
1
如果字符串已经被内部化,那么Intern将返回传入的完全相同的引用。我不知道文字自动内部化的事实,但这完全是有道理的。 - Steven Sudit
那么,如何构建一个未被整合的字符串? - Dmitri Nesteruk
@DmitriNesteruk:new String(String) - Jon Skeet
@JonSkeet 抱歉,不明白你的意思。new String(String) 无法编译。 - Dmitri Nesteruk
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接