0

我想做类似的事情

IsItAStringLiteral("yes")
var v = "no";
IsItAStringLiteral(v)

具有明显的回报价值。可能吗?

4

2 回答 2

4

不,您将无法判断字符串是否为文字。

原因很简单:文字、字符串变量、各种类型的实习字符串……每一个都是对 System.String 的引用。并且所有字符串,当按值传递时,都会在使用它们的函数调用之前加载到堆栈中(因此,与引用它们的任何变量的名称无关)。到调用函数时,字面量和变量看起来完全一样,并且在按值传递时将被视为完全相同。

唯一可能的方法是一些unsafe可能检查对象地址的东西。如果地址在程序集的地址空间内,则几乎可以肯定它来自某种常量。但这是不可靠的(因为设置为文字的字符串看起来就像文字一样),非常hackish,丑陋,最重要的是对于我能想到的任何目的都是不必要的。

如果您必须关心字符串是否是文字,您可能应该重新考虑您正在做什么。

于 2010-10-16T06:36:58.427 回答
2

您可以使用 string.IsInterned 方法来确定给定字符串是否在 .NET 实习生池中。在应用程序开始运行之前,所有字符串文字都会自动添加到实习池中。

当然,这对您的确切问题没有帮助。变量 'v' 将引用一个字符串文字,因此它也会出现在实习生池中。为什么需要这样的功能?

于 2010-10-16T05:42:34.863 回答