我有一个第三方.NET DLL函数,该函数返回一个字符串并包含一个名为sentinel的字符串参数,记录为.
如果(条件)发生,则函数将返回作为参数sentinel提供的字符串。在任何其他情况下,代码都不会使用此参数。可以通过对返回的值使用Object.ReferenceEquals来测试此条件。不要使用==测试前哨值,因为加载的字符串可能具有相同的文本值。不要提供空,因为当(原因)和两个不同的空值无法区分时,哨兵函数将返回空。
这种机制在.NET中可靠吗?第三方只能控制它自己的DLL中的代码,而不能控制运行时所做的事情。
如果我在哨兵和库读取"x“时提供由新字符串(‘x’,1)创建的字符串对象,我能确保.NET永远不会保存额外的引用并重用它发现的另一个字符串对象吗?
(我承认有更好的方法来做到这一点,但这超出了这个问题的范围。)
发布于 2014-03-20 17:13:26
这取决于哨兵值是如何提供的。
通常,运行时生成的string将是唯一的,并保留一个唯一的实例。但是,如果使用了一个常量,它就会被内插,而且任何具有相同值的其他常量都可能由于字符串实习生而成为相同的引用。
尽管如此,使用一个值作为一个应该真正独特的哨兵(例如guid)似乎是一种更好、更安全的方法。考虑到它是第三方,而且您不能更改它,如果您提供了前哨值,我建议在比较方法不重要的地方使用字符串值(即:确保它是一个真正的、唯一的字符串)。
https://stackoverflow.com/questions/22540345
复制相似问题