6

メソッド引数が関数の入力時にnullでないことを確認していますが、空の文字列のセマンティクスをnullインスタンスでオーバーロードするため、これは機能しません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();
}

変数の値はnull以外ですが、==比較演算子がオーバーロードされているため、インスタンスが空であるため、と比較するとnullptrtrueが返されます。String

私が見る限り、これにより、Stringsの関数エントリで適切なnullチェックを行うことができなくなります。本当にそうですか?

4

2 に答える 2

11

Windows ランタイムには "null 文字列" はありません。「ヌル」と「空」は、文字列に関して同じことを意味します。

は構文をPlatform::String使用し^、参照型のように見えますが、そうではありません。Windows ランタイムの基本型の射影ですHSTRING。"null" HSTRING は、空の HSTRING と区別できません。

aPlatform::String^が "null" のように見えても (デバッガーなどで)、空の文字列として扱っても安全です。s->Length()連結、呼び出しなどに使用できます。


C# では、aを null にするstringことができます (したがって、null をテストできます) がstring、Windows ランタイム呼び出しから null を取得することはなく、null 文字列を引数として Windows ランタイム関数に渡すことはできません (そうすることで、 ABI 境界での例外)。

于 2012-08-31T12:38:47.053 に答える
2

あなたは正しいようです。に設定されnullptrている文字列は、空の文字列として扱われます。そしてnullptr、関数に渡しても、NullReferenceException.

bool NullPtrTest(Platform::String^ value)
{
  return value == nullptr;
}

bool EmptyTest(Platform::String^ value)
{
  return value->IsEmpty();
}

bool ReferenceEqualsWithNullPtrTest(Platform::String^ value)
{
  return Platform::String::ReferenceEquals(nullptr, value);
}

bool EqualsWithValueTest(Platform::String^ value)
{
  return value->Equals("test");
}

//...

NullPtrTest(nullptr); // true
NullPtrTest(ref new Platform::String()); // true
NullPtrTest("test"); // false


EmptyTest(nullptr); // true - no exception
EmptyTest(ref new Platform::String()); // true
EmptyTest("test"); // false


ReferenceEqualsWithNullPtrTest(nullptr); // true
ReferenceEqualsWithNullPtrTest(ref new Platform::String()); // true
ReferenceEqualsWithNullPtrTest("test"); // false


EqualsWithValueTest(nullptr); // false - no exception
EqualsWithValueTest(ref new Platform::String()); // false
EqualsWithValueTest("test"); // true

したがって、文字列がこれまでにあったかどうかを調べる方法はありませんnullptr

于 2012-08-31T11:39:00.523 に答える