web-dev-qa-db-ja.com

Nullable ToString()

私はどこでも次のような構造を見ています:

int? myVar = null;
string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty;

単純に使用しない理由:

string test = myVar.ToString();

それはまったく同じではありませんか?少なくともReflectorは次のように述べています。

public override string ToString()
{
  if (!this.HasValue)
  {
    return "";
  }
  return this.value.ToString();
}

だから、それは正しいですか(短いバージョン)、または何かが欠けていますか?

136
IamDeveloper

あなたは全く正しいです。また、 この質問 では、ToString()がすでに正しい答えを出していることに誰も気付いていないのに、前者の解決策が提案されています。

より冗長な解決策の引数は読みやすさかもしれません:supposednullである何かに対してToString()を呼び出すと、通常はexpectNullReferenceExceptionですが、ここではスローされません。

111
Tomas Vana

Null値を保持できるオブジェクトの自然な動作ではないため、多くの人がこのようなチェックを持っていると思います。

14
Andrew Bezzub

いいえ、あなたは正しいです、短いバージョンは他の人々がその点でやったことと同じです。 nullablesを含む三項演算子の代わりに私がよく使用する他の構造は、null合体演算子です。また、nullから保護します。 ToString()の場合、(指摘したように)必要ではありませんが、デフォルトのint値(たとえば)の場合、うまく機能します。例えば:

int page = currentPage ?? 1;

これにより、ページですべての整数演算を行うことができます。最初に明示的にnullチェックとcurrentPageの値の呼び出しを明示的に実行します(currentPageはint?おそらくparamとして渡されます)

5
Paul

私はそれが関連していたずっと後に知っていますが、... intのようなnull許容型のためだと思いますか? .ToString()メソッドでは、フォーマット文字列を使用できません。 ToString()でNULL可能DateTimeをフォーマットするにはどうすればよいですか? を参照してください。おそらく元のコードでは、.ToString()にフォーマット文字列があったか、コーダーがフォーマット文字列なしの.ToString()がnull許容型でまだ利用可能であることを忘れていた可能性があります。

5
outis nihil

パターンに従うだけなのでしょうか?または彼らはバックエンドを知りません。あなたは正しいコードはまったく同じです。あなたもできます:

int? i = null;
i.ToString(); //No NullReferenceException
3
Andrey

_int?_は、null許容変数の宣言を簡素化する構文シュガーです。 _Nullable<int>_と同じです。

したがって、_Nullable<T>_のToString()メソッドの実装を見ると、(以下を参照)がある場合、空の文字列を返すことに気付くことができます値なし。

_public struct Nullable<T> where T : struct
{
    public override string ToString()
    {
      if (!this.hasValue)
        return "";
      return this.value.ToString();
    }
}
_

MSDNの言うこと:

Nullable.ToStringメソッド

HasValueプロパティがtrueの場合、現在のNullableオブジェクトの値のテキスト表現を返します。HasValueプロパティがfalseの場合、空の文字列( "")を返します。

したがって、次のコードはArgumentNullException例外をスローする代わりに空の文字列をコンソールに出力します。

_static void Main(string[] args)
{
    int? a = null;
    Console.WriteLine(a.ToString()); // Prints empty string to console.
}
_
1
Aliaksei Maniuk