web-dev-qa-db-ja.com

ToString()の前にnullをチェックする

ここにシナリオがあります...

if (entry.Properties["something"].Value != null)
  attribs.something = entry.Properties["something"].Value.ToString();

効果的で正しく動作している間、これはthisいように見えます。 ToString()を実行する前にnullをチェックしない場合、プロパティがnullの場合は例外をスローします。このシナリオを処理するより良い方法はありますか?

とても有難い!

74
Dscoduc

8年後に更新して(すごい!) c#6のヌル条件演算子

var value = maybeNull?.ToString() ?? ""

その他のアプローチ:

object defaultValue = "default";
attribs.something = (entry.Properties["something"].Value ?? defaultValue).ToString()

私もこれを使用しましたが、これはひどく賢いわけではありませんが便利です。

public static string ToSafeString(this object obj)
{
    return (obj ?? string.Empty).ToString();
}
121
Rex M

.NET Framework 3.5をターゲットにしている場合、最もエレガントなソリューションは、私の意見では拡張メソッドです。

public static class ObjectExtensions
{
    public static string NullSafeToString(this object obj)
    {
        return obj != null ? obj.ToString() : String.Empty;
    }
}

次に使用する:

attribs.something = entry.Properties["something"].Value.NullSafeToString();
41
Dale Ragan
Convert.ToString(entry.Properties["something"].Value);
39
Vahid

オブジェクトに空の文字列を追加することは、次のようにnullセーフなToString変換を可能にする一般的なイディオムです。

attribs.something = ""+entry.Properties["something"].Value;

いつ entry.Properties["something"].Valuenullで、空のstringを静かに返します。

編集: C#6以降では、?.演算子は、nullチェックをさらに簡単な方法で回避します。

attribs.something = entry.Properties["something"].Value?.ToString();
//                                                     ^^
3
dasblinkenlight

できません:

attribs.something = entry.Properties["something"].Value as string;
2
NotDan
attribs.something = String.Format("{0}", entry.Properties["something"].Value);

しかし、パフォーマンスについてはわかりません...

2
user645280

上記のDale Raganの答え のようなことを何らかの方法で行うことは可能ですが、新しいNullSafeToString()メソッドを作成する代わりにToString()をオーバーライドしますか?私はこれを(または「null」を返す)デフォルトの動作にしたいです。コンパイラ(Visual C#2010 Express)は、次のメソッドをパブリック静的クラスObjectExtensionsに追加しても文句を言いませんが、メソッドは呼び出されません...

public static String ToString(this Object obj)
{
    if (obj == null)
    {
        return "null";
    }
    else
    {
        return obj.GetType().Name;
    }
}
1
Dave the Rave
attribs.something  = string.Format("{0}",entry.Properties["something"].Value)
1
aljj

C#6.0では、非常にエレガントな方法でそれを行うことができます。

attribs.something = entry.Properties["something"].Value?.ToString();

そして、新しい null-conditional operator に関する記事があります。

1
ZuoLi

RexMの答えのバリエーションとして:

attribs.something = (entry.Properties["something"].Value ?? attribs.something).ToString()

唯一の欠点は、entry.Properties ["something"]。Valueがnullでもattribs.somethingに値(この例ではそれ自体)が割り当てられることです。および/または、この行は多くを実行します(ループのように)。

1
PhilChuang

ヘルパーメソッドを実行しようとしていることを正確に実行するには、常に使用できます。

CopyIfNotNull(entry.Properties["something"].Value, out attribs.something);

void CopyIfNotNull(string src, out string dest)
{
  if(src != null)
    dest = src;
}
1
Mike Hall

次のような補助メソッドを使用してみてください。

_attribs.something = getString(
    entry.Properties["something"].Value, 
    attribs.something);

static String getString(
    Object obj,
    String defaultString)
{
    if (obj == null) return defaultString;
    return obj.ToString();
}
_

または、_??_演算子を使用できます。

_attribs.something = 
    (entry.Properties["something"].Value ?? attribs.something).ToString();
_

(値がnullである場合の冗長ToString()呼び出しに注意してください)

0
Zach Scrivena