1

この質問に対する彼の回答で、BlackBear は を置き換えることを提案しました。

 string y = Session["key"] == null ? "none" : Session["key"].ToString();

 string y = (Session["key"] ?? "none").ToString();

が文字列値の場合Session["key"]はうまく機能しますが、これをオブジェクトで実行したい場合はどうすればよいでしょうか? たとえば、私はこれを行うことができます:

 string y = GetMyObject() == null ? "none" : GetMyObject().ToString();

GetMyObject()しかし、 2 回評価したくない場合はどうすればよいでしょうか。結果を変数に格納し、その変数で null をチェックする唯一の選択肢はありますか?

 var x = GetMyObject();
 string y = (x == null) ? "none" : x.ToString();

編集:これはすべて理論上のものです。以前に遭遇したことがありますが、今のところ具体的な例はありません。そうは言っても、ここにサンプルクラスがあります。

class MyObject
{
   private MyObject() { }
   public MyObject GetMyObject() { return new MyObject(); }
   public override string ToString() { return "A String"; }
}

もしそうならstring y = (GetMyObject() ?? "none").ToString();、私は得る

演算子「??」タイプ 'MyObject' および 'string' のオペランドには適用できません。

理想的には、私はできるだろう

 string y = GetMyObject().ToString() ?? "none";

GetMyObject() が null の場合でも動作するようにします。基本的に、自己完結型として機能する null 合体演算子try {} catch (NullReferenceException) {}できないことはわかっていますが、それが理想です。

4

3 に答える 3

4

BlackBear のソリューションはそのままで問題なく動作します。

string y = (GetMyObject() ?? "none").ToString();

それは(null以外の参照を返す場合)またはそうでない場合に設定さyれます。ひもに非常に小さなヒットコールがありますが、それが重要であるかどうかは非常に疑わしいです.GetMyObject().ToString()GetMyObject()"none".ToString()ToString()

GetMyObject()が返されれば問題ありませんobject。変換string できない特定の型を返す場合は、そのうちの 1 つをobjectにキャストするだけです。

string y = (GetMyButton() ?? (object) "none").ToString();

そうは言っても、おそらくその時点で拡張メソッドを使用するか、単に手書きで行うでしょう。

于 2012-03-23T19:43:44.580 に答える
2

?.一部の言語のように記述された、null セーフな逆参照演算子を使用したいようです。

var x = GetMyObject()?.ToString() ?? "none";

残念ながら、C# にはこの演算子がありません。すでに行っている方法で行うことができます。

この演算子は、言語への追加が検討されました。ただし、リリースされた C# のバージョンには含まれませんでした。

于 2012-03-23T19:34:34.693 に答える
0

コードに欠けているものは[通常]追加できます:

private static object SafeToString( object obj, string defaultString = "none" )
{
    return obj != null ? obj.ToString() : defaultString;
}
于 2012-03-23T19:40:29.277 に答える