私はどこでも次のような構造を見ています:
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();
}
だから、それは正しいですか(短いバージョン)、または何かが欠けていますか?
あなたは全く正しいです。また、 この質問 では、ToString()
がすでに正しい答えを出していることに誰も気付いていないのに、前者の解決策が提案されています。
より冗長な解決策の引数は読みやすさかもしれません:supposedがnull
である何かに対してToString()
を呼び出すと、通常はexpectNullReferenceException
ですが、ここではスローされません。
Null値を保持できるオブジェクトの自然な動作ではないため、多くの人がこのようなチェックを持っていると思います。
いいえ、あなたは正しいです、短いバージョンは他の人々がその点でやったことと同じです。 nullablesを含む三項演算子の代わりに私がよく使用する他の構造は、null合体演算子です。また、nullから保護します。 ToString()の場合、(指摘したように)必要ではありませんが、デフォルトのint値(たとえば)の場合、うまく機能します。例えば:
int page = currentPage ?? 1;
これにより、ページですべての整数演算を行うことができます。最初に明示的にnullチェックとcurrentPageの値の呼び出しを明示的に実行します(currentPageはint?おそらくparamとして渡されます)
私はそれが関連していたずっと後に知っていますが、... intのようなnull許容型のためだと思いますか? .ToString()メソッドでは、フォーマット文字列を使用できません。 ToString()でNULL可能DateTimeをフォーマットするにはどうすればよいですか? を参照してください。おそらく元のコードでは、.ToString()にフォーマット文字列があったか、コーダーがフォーマット文字列なしの.ToString()がnull許容型でまだ利用可能であることを忘れていた可能性があります。
パターンに従うだけなのでしょうか?または彼らはバックエンドを知りません。あなたは正しいコードはまったく同じです。あなたもできます:
int? i = null;
i.ToString(); //No NullReferenceException
_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.
}
_