1. ホーム
  2. c#

[解決済み] ダイレクトキャスト vs 'as'演算子?

2022-03-20 03:35:17

質問

次のコードを考えてください。

void Handler(object o, EventArgs e)
{
   // I swear o is a string
   string s = (string)o; // 1
   //-OR-
   string s = o as string; // 2
   // -OR-
   string s = o.ToString(); // 3
}

3種類のキャスティングの違いは何ですか(いいですか、3番目はキャスティングではありませんが、意図は伝わりますよね)。どれが優先されるべきでしょうか?

どのように解決するのですか?

string s = (string)o; // 1

スロー 無効キャスト例外(InvalidCastException もし ostring . そうでない場合は os であっても onull .

string s = o as string; // 2

を割り当てる。 nulls もし ostring または onull . このため、値型に対して使用することはできません(演算子は決して null となります。) そうでなければ,代入 os .

string s = o.ToString(); // 3

を発生させます。 NullReferenceException もし onull . を割り当てます。 o.ToString() を返します。 s がどのようなものであっても o があります。


ほとんどの変換に1を使用します。シンプルでわかりやすいからです。型が正しくない場合、通常は例外が発生することを想定しているので、2はほとんど使わない傾向にあります。このreturn-nullタイプの機能の必要性は、エラーコードを使うようなひどい設計のライブラリでしか見たことがありません(例:例外を使う代わりにreturn null = error)。

3はキャストではなく、単なるメソッド呼び出しです。文字列でないオブジェクトの文字列表現が必要な場合に使用します。