ここにシナリオがあります...
if (entry.Properties["something"].Value != null)
attribs.something = entry.Properties["something"].Value.ToString();
効果的で正しく動作している間、これはthisいように見えます。 ToString()を実行する前にnullをチェックしない場合、プロパティがnullの場合は例外をスローします。このシナリオを処理するより良い方法はありますか?
とても有難い!
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();
}
.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();
Convert.ToString(entry.Properties["something"].Value);
オブジェクトに空の文字列を追加することは、次のようにnullセーフなToString
変換を可能にする一般的なイディオムです。
attribs.something = ""+entry.Properties["something"].Value;
いつ entry.Properties["something"].Value
はnull
で、空のstring
を静かに返します。
編集: C#6以降では、?.
演算子は、null
チェックをさらに簡単な方法で回避します。
attribs.something = entry.Properties["something"].Value?.ToString();
// ^^
できません:
attribs.something = entry.Properties["something"].Value as string;
attribs.something = String.Format("{0}", entry.Properties["something"].Value);
しかし、パフォーマンスについてはわかりません...
上記の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;
}
}
attribs.something = string.Format("{0}",entry.Properties["something"].Value)
C#6.0では、非常にエレガントな方法でそれを行うことができます。
attribs.something = entry.Properties["something"].Value?.ToString();
そして、新しい null-conditional operator に関する記事があります。
RexMの答えのバリエーションとして:
attribs.something = (entry.Properties["something"].Value ?? attribs.something).ToString()
唯一の欠点は、entry.Properties ["something"]。Valueがnullでもattribs.somethingに値(この例ではそれ自体)が割り当てられることです。および/または、この行は多くを実行します(ループのように)。
ヘルパーメソッドを実行しようとしていることを正確に実行するには、常に使用できます。
CopyIfNotNull(entry.Properties["something"].Value, out attribs.something);
void CopyIfNotNull(string src, out string dest)
{
if(src != null)
dest = src;
}
次のような補助メソッドを使用してみてください。
_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()
呼び出しに注意してください)