我们正在验证函数输入时方法参数不为空,但这不适用于 Platform::String
(或 Platform.String
,C# 或 C++ 之间没有区别),因为它们用空实例重载空字符串的语义。
考虑一下,总是会抛出异常:
auto emptyString = ref new Platform::String();
// Now, emptyString.IsEmpty() will be true
if (emptyString == nullptr)
{
throw ref new Platform::InvalidArgumentException();
}
该变量具有非空值,但
==
比较运算符已重载,因此将其与 nullptr
进行比较返回 true,因为 String
实例为空。据我所知,这使我们无法在
String
的函数入口处进行适当的空检查。 s。真的是这样吗?
最佳答案
Windows 运行时中没有“空字符串”。 “Null”和“empty”对于字符串的含义相同。
尽管Platform::String
使用 ^
语法并且看起来像一个引用类型,但它不是:它是 Windows 运行时基本类型的投影, HSTRING
. “空”HSTRING 与空 HSTRING 无法区分。
即使一个 Platform::String^
似乎是“null”(例如在调试器中),将其视为空字符串是安全的。您可以将其用于串联,请调用 s->Length()
, 等等。
在 C# 中,一个 string
可以为空(因此您可以测试它是否为空),但您永远不会得到空值 string
来自 Windows 运行时调用,并且您不能将空字符串作为参数传递给 Windows 运行时函数(这样做会在 ABI 边界产生异常)。
关于windows-runtime - 如何区分空 Platform.String 和空 Platform.String^,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12214515/