带有字符串的ReferenceEquals可以可靠地用于检测标记值吗?

时间:2014-03-20 17:10:56

标签: c# .net string

我有一个第三方.NET DLL,其函数返回一个字符串,并包含一个名为 sentinel 的字符串参数,记录为......

  

如果发生(条件),函数将返回作为参数 sentinel 提供的字符串。在任何其他情况下,代码都不会使用此参数。可以通过对返回的值使用 Object.ReferenceEquals 来测试此条件。不要使用==来测试sentinel值,因为加载的字符串可能巧合地具有相同的文本值。不要提供 null 作为标记,因为当(原因)函数将返回 null 并且无法区分两个不同的空值时。

这种机制在.NET中是否可靠?第三方只能控制哪些代码进入它自己的DLL,并且无法控制运行时的功能。

如果我提供由新字符串(' x',1)创建的字符串对象作为标记并且库读取" x",我可以确定.NET永远不会保存额外的引用并重用它发现的其他字符串对象?

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

1 个答案:

答案 0 :(得分:2)

这取决于如何提供 sentinel 值。

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

话虽如此,使用值作为哨兵应该是真正独特的(例如guid)似乎是一种更好,更安全的方法。鉴于它是第三方并且您无法更改它,如果您提供了标记值,我建议使用字符串vaule,其中比较方法无关紧要(即:确保它是真实的,唯一的字符串)。 / p>