我想做类似的事情
IsItAStringLiteral("yes")
var v = "no";
IsItAStringLiteral(v)
具有明显的回报价值。可能吗?
我想做类似的事情
IsItAStringLiteral("yes")
var v = "no";
IsItAStringLiteral(v)
具有明显的回报价值。可能吗?
不,您将无法判断字符串是否为文字。
原因很简单:文字、字符串变量、各种类型的实习字符串……每一个都是对 System.String 的引用。并且所有字符串,当按值传递时,都会在使用它们的函数调用之前加载到堆栈中(因此,与引用它们的任何变量的名称无关)。到调用函数时,字面量和变量看起来完全一样,并且在按值传递时将被视为完全相同。
唯一可能的方法是一些unsafe
可能检查对象地址的东西。如果地址在程序集的地址空间内,则几乎可以肯定它来自某种常量。但这是不可靠的(因为设置为文字的字符串看起来就像文字一样),非常hackish,丑陋,最重要的是对于我能想到的任何目的都是不必要的。
如果您必须关心字符串是否是文字,您可能应该重新考虑您正在做什么。
您可以使用 string.IsInterned 方法来确定给定字符串是否在 .NET 实习生池中。在应用程序开始运行之前,所有字符串文字都会自动添加到实习池中。
当然,这对您的确切问题没有帮助。变量 'v' 将引用一个字符串文字,因此它也会出现在实习生池中。为什么需要这样的功能?