2

ToString私は内容に満足している実装された単純なクラスを持っています。さまざまなオプションに賛否両論があるかどうかを確認して、(最も)正しい方法を決定しようとしています。

以下の例では:

  • クラス:Astronaut
  • タイプの変数Astronaut:person

私がここで雪だるまをしているオプション:

  1. string result = person == null ? "Unknown Astronaut" : person.ToString();
  2. string result = person.ToString() ?? "Unknown Astronaut";
  3. string result = (person ?? "Unknown Astronaut").ToString();
  4. string result = person ?? (object)"Unknown Astronaut";

それらについての私の見解は

  1. 非常に冗長で、そのレベルの冗長性は必要ありません。
  2. 1 よりははるかに優れていますが、ToString見苦しいだけでなく、そのToStringコードの例外が心配されます。
  3. これは人気があるようですが (ここここ)、うまくいくかどうかはわかりません。コンパイラはstringAstronaut型が同じ型ではないため、合体では使用できないと不平を言いませんか。
  4. これは私が今最も満足しているものですが、これはボックス & が null であることを意味しToStringますperson

要約すれば:

  • 上記のいずれかに対する長所/短所はありますか?
  • 考えられるオプションはありますか?
4

4 に答える 4

6

私は拡張方法を好む:

public static string SafeToString(this Object obj)
{
   return obj.SafeToString(string.Empty);
}

public static string SafeToString(this Object obj, string defaultString)
{
   return obj == null ? defaultString : obj.ToString();
}

だからあなたの質問に:

string result = person.SafeToString("Unknown Astronaut");
于 2011-04-18T08:00:32.870 に答える
3

静的ToStringメソッドを作成し、次のように呼び出します。

string result = Astronaut.ToString(person);

一般的なコードを除外する最良の方法。

于 2011-04-18T07:58:59.493 に答える
1

null オブジェクトを埋めるためだけにインスタンス化するオブジェクトについて教えてくれたデザイン パターンの本を覚えています。名前の場合は空の文字列、長さの場合は 0 などを返します。悪い考えのようには聞こえません。

Astronautクラス の静的メソッドとして実装することもできます。

String result = Astronaut.getName(person);
于 2011-04-18T08:02:09.007 に答える
0

Astronaut を文字列に変換したり、引数が null の場合は "Unknown astronaut" を返したりする静的メソッドをクラスに配置することもできます。

同様に、それを拡張メソッドにして、null であっても、その型の変数で直接呼び出すことができます。

于 2011-04-18T08:00:25.643 に答える