C++/CX 中本机 null 和托管 null 之间的区别
Difference between native null and managed null in C++/CX
我在某处看到了一段代码,如下所示。
方法 GetInfo
从项目的托管部分调用(用 C# 编写),它是本地方法(用 C++ 编写)的包装器。
令我困惑的是,如果 bEverythingOK
是 false
,那么托管代码会收到 nullptr
。
这可能是未定义的行为吗?如果是,返回托管 null(不是空字符串)的正确模式是什么?
托管 null 和本机 null 之间有什么区别吗?它们应该混合在一起吗?
原生部分:
String^ ConvertString(const std::string &nativeString)
{
bool bEverythingOK = false;
if(!bEverythingOK)
{
return nullptr;
}
else
{
return ref new String(std::wstring(nativeString.begin(), nativeString.end()).c_str());
}
}
String^ GetInfo()
{
std::string info = NativeMethod();
return ConvertString(info);
}
托管部分:
void ManagedMethod()
{
string info = GetInfo();
if (info == null)
{
Console.WriteLine("Null string received.");
}
else
{
// Do something with the string
}
// ...
}
托管和非托管之间没有区别nullptr
。您是正确的,如果 bEverythingOK
是 false
,那么托管代码会收到 nullptr
。还没有什么未定义的。这完全取决于调用者对 nullptr
做了什么。 (这是您没有包含的代码。)
请注意 Platform::String^
表示必须将 nullptr
字符串指针视为零长度字符串,因此通常使用 nullptr
其中 String^
预计是安全和正常的。
我在某处看到了一段代码,如下所示。
方法 GetInfo
从项目的托管部分调用(用 C# 编写),它是本地方法(用 C++ 编写)的包装器。
令我困惑的是,如果 bEverythingOK
是 false
,那么托管代码会收到 nullptr
。
这可能是未定义的行为吗?如果是,返回托管 null(不是空字符串)的正确模式是什么?
托管 null 和本机 null 之间有什么区别吗?它们应该混合在一起吗?
原生部分:
String^ ConvertString(const std::string &nativeString)
{
bool bEverythingOK = false;
if(!bEverythingOK)
{
return nullptr;
}
else
{
return ref new String(std::wstring(nativeString.begin(), nativeString.end()).c_str());
}
}
String^ GetInfo()
{
std::string info = NativeMethod();
return ConvertString(info);
}
托管部分:
void ManagedMethod()
{
string info = GetInfo();
if (info == null)
{
Console.WriteLine("Null string received.");
}
else
{
// Do something with the string
}
// ...
}
托管和非托管之间没有区别nullptr
。您是正确的,如果 bEverythingOK
是 false
,那么托管代码会收到 nullptr
。还没有什么未定义的。这完全取决于调用者对 nullptr
做了什么。 (这是您没有包含的代码。)
请注意 Platform::String^
表示必须将 nullptr
字符串指针视为零长度字符串,因此通常使用 nullptr
其中 String^
预计是安全和正常的。