带字符串的ReferenceEquals可以可靠地用于检测哨兵值吗?

本文关键字:哨兵 检测 用于 字符串 ReferenceEquals | 更新日期: 2023-09-27 17:51:11

我有一个第三方。net DLL函数,它返回一个字符串,并包含一个名为sentinel的字符串参数,文档为…

如果(condition)发生,函数将返回作为参数sentinel提供的字符串。代码将不会在任何其他情况下使用此参数。可以使用Object来测试此条件。ReferenceEquals返回值的。不要使用==来测试哨兵值,因为加载的字符串可能恰好具有相同的文本值。不要提供null作为哨兵,因为当(原因)和两个不同的null不能区分时,函数将返回null

这个机制在。net中可靠吗?第三方只能控制哪些代码进入它自己的DLL,而不能控制运行时做什么。

如果我提供一个由new string('x',1)创建的字符串对象作为哨兵,并且库读取一个"x",我可以肯定。net永远不会保存额外的引用并重用它发现的其他字符串对象吗?

(我承认有更好的方法来做到这一点,但这超出了这个问题的范围。)

带字符串的ReferenceEquals可以可靠地用于检测哨兵值吗?

这取决于哨兵值是如何提供的。

通常,运行时生成的string将是唯一的,并保持单个唯一实例。但是,如果使用了常量,它将被拘禁,并且由于字符串拘禁,任何具有相同值的其他常量都可能是相同的引用。

也就是说,使用值作为真正唯一的哨兵(比如guid)似乎是一种更好、更安全的方法。考虑到它是第三方的,你不能改变它,如果你提供哨兵值,我建议使用字符串值,比较方法无关紧要(即:确保它是一个真正的,唯一的字符串)。