C++/CX 中本机 null 和托管 null 之间的区别

Difference between native null and managed null in C++/CX

我在某处看到了一段代码,如下所示。

方法 GetInfo 从项目的托管部分调用(用 C# 编写),它是本地方法(用 C++ 编写)的包装器。

令我困惑的是,如果 bEverythingOKfalse,那么托管代码会收到 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。您是正确的,如果 bEverythingOKfalse,那么托管代码会收到 nullptr。还没有什么未定义的。这完全取决于调用者对 nullptr 做了什么。 (这是您没有包含的代码。)

请注意 Platform::String^ 表示必须将 nullptr 字符串指针视为零长度字符串,因此通常使用 nullptr 其中 String^ 预计是安全和正常的。