Nullable ToString()


142

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

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

なぜ単純に使用しないのですか?

string test = myVar.ToString();

まったく同じではないですか?少なくともリフレクターはこう言っています:

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

それで、それは正しいですか(短いバージョン)、または何か不足していますか?


1
私はこのようなコードを見たことがありません:)
tymtam

回答:


112

あなたはまったく正しいです。また、中にこの質問誰もが実際に気づいていない一方で、かつての解決策を提案していますToString()いますが、正しい答えを示しているてい。

たぶん、より詳細なソリューションのための引数は読みやすさです:あなたが呼び出すとToString()されて何かになってであることをnull、あなたは通常、期待しNullReferenceException、ここでそれがスローされていないが、。


21
実際、少なくとも2人が気づきました:エリックリッペルトとヨハネスロッセル。
Jon Skeet

7
これはあなたが意図したものではないと確信していますが、参照は実際にはnullではありません。Nullable <T>は値の型です。これが、呼び出しがスローされToString()ずに機能する理由NullReferenceExceptionです。
Thorarin 2014

2
それがメンタリティだったとしても、あなたは.HasValueまだその例外を投げることを期待するでしょう。
Extragorey

人々が冗長バージョンを使用するもう1つの理由myNullableDateTime.HasValue ? myNullableDateTime.Value.ToString("d") : nullは、目的のToStringメソッドにアクセスするためにラップされていないオブジェクトが必要な場合のような式との同等性のためです。もちろん、そのためのより簡潔な解決策もあります$"{myNullableDateTime:d}"
。– Extragorey

14

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


@Andrewは同意しました。なぜなら、(私のような)人々は最初は例外をスローすると思っているからです。
Nathan Koop、2010年

1
これがその振る舞いだとは思いもしませんでした。(x == null)に対してtrueを返すコンストラクトも、x.ToString()を呼び出すとNullReferenceExceptionをスローすると考えていました。
ダンブライアント

5

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

int page = currentPage ?? 1;

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


5

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


3

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

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

nullStringはメニューにないため、ToString()がインバリアントカルチャである必要がある場合は、長いルートをたどる必要があるかもしれません。
ΕГИІИО

1

int?null許容変数の宣言を簡略化する構文シュガーです。と同じNullable<int>です。

したがって、ToString()メソッドの実装Nullable<T> (下を参照)を見ると、値がない場合に空の文字列を返すことがわかります。

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.
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.