次の 2 つのステートメントの使用の違いは何ですか? 最初の「文字列として」は型キャストですが、2番目のToStringは入力を文字列に変換するメソッドへの実際の呼び出しですか? もしあれば、いくつかの洞察を探しています。
Page.Theme = Session["SessionTheme"] as string;
Page.Theme = Session["SessionTheme"].ToString();
でない場合Session["SessionTheme"]
はstring
、as string
を返しnull
ます。
.ToString()
ToString()
オブジェクトのメソッドを呼び出して、他の型を文字列に変換しようとします。ほとんどの組み込み型では、文字列に変換されたオブジェクトが返されますが、特定の.ToString()
メソッドを持たないカスタム型では、オブジェクトの型の名前が返されます。
object o1 = "somestring";
object o2 = 1;
object o3 = new object();
object o4 = null;
string s = o1 as string; // returns "somestring"
string s = o1.ToString(); // returns "somestring"
string s = o2 as string; // returns null
string s = o2.ToString(); // returns "1"
string s = o3 as string; // returns null
string s = o3.ToString(); // returns "System.Object"
string s = o4 as string; // returns null
string s = o4.ToString(); // throws NullReferenceException
心に留めておくべきもう 1 つの重要なことは、オブジェクトが の場合null
、呼び出し.ToString()
は例外をスローしますが、as string
単に を返すということnull
です。
as
キーワードは基本的に、内部で MSIL オペコードを使用して、オブジェクトが型のインスタンスであるかどうかをチェックしis
ますisinst
。そうである場合は、オブジェクトへの参照を返し、そうでない場合は null 参照を返します。
多くの人が言うように、キャスト自体を実行しようとはしません。これは、ある種の例外処理を意味します。そうではありません。
ToString()
ToString()
、クラスによって実装されたカスタムメソッド(ほとんどの組み込み型の場合、文字列への変換を実行します)または何も提供されていない場合は、object
型情報を返す基本クラスのメソッドのいずれかを呼び出すだけです。
Page.Theme = Session["SessionTheme"] as string;
文字列にキャストしようとします
一方
Page.Theme = Session["SessionTheme"].ToString();
メソッドを呼び出しますToString()
。これは実際には何でもかまいません。このメソッドはキャストしません。このオブジェクトの文字列表現を返す必要があります。
これらのうち3つを比較するリソースは見つかりましたが、4つすべてを比較する説明は見つからなかったので、Philippe Leybaertの受け入れられた回答を少し拡張しています。
(string)obj
obj as string
obj.ToString()
Convert.ToString(obj)
object o1 = "somestring";
object o2 = 1;
object o3 = new object();
object o4 = null;
Console.WriteLine((string)o1); // returns "somestring"
Console.WriteLine(o1 as string); // returns "somestring"
Console.WriteLine(o1.ToString()); // returns "somestring"
Console.WriteLine(Convert.ToString(o1)); // returns "somestring"
Console.WriteLine((string)o2); // throws System.InvalidCastException
Console.WriteLine(o2 as string); // returns null
Console.WriteLine(o2.ToString()); // returns "1"
Console.WriteLine(Convert.ToString(o2)); // returns "1"
Console.WriteLine((string)o3); // throws System.InvalidCastException
Console.WriteLine(o3 as string); // returns null
Console.WriteLine(o3.ToString()); // returns "System.Object"
Console.WriteLine(Convert.ToString(o3)); // returns "System.Object"
Console.WriteLine((string)o4); // returns null
Console.WriteLine(o4 as string); // returns null
Console.WriteLine(o4.ToString()); // throws System.NullReferenceException
Console.WriteLine(Convert.ToString(o4)); // returns string.Empty
これらの結果から、 が文字列または nullの場合は互いに同じように動作する(string)obj
ことがわかります。そうしないと、無効なキャスト例外がスローされ、null が返されます。
また、が nullの場合を除き、相互に同じように動作します。その場合、null 参照例外がスローされ、空の文字列が返されます。obj as string
obj
(string)obj
obj as string
obj.ToString()
Convert.ToString(obj)
obj
obj.ToString()
Convert.ToString(obj)
だからここに私の推奨事項があります:
(string)obj
文字列変数 (null を含む) に割り当てることができない型の例外をスローする場合に最適です。obj as string
例外をスローしたくない場合や、文字列以外の文字列表現も必要ない場合に最適です。obj.ToString()
null の例外をスローする場合に最適ですConvert.ToString(obj)
例外をスローせず、文字列以外の文字列表現が必要な場合に最適です編集:オーバーロードに応じて実際に異なるConvert.ToString()
処理を行うことを発見したため、この例では変数が an として宣言されていることが実際に重要です。その変数を呼び出すと、代わりにが返されます。null
object
Convert.ToString()
string
null
null
string.Empty
まず第一に、「any-object as string」と「any-object.ToString()」は、それぞれのコンテキストに関して完全に異なるものです。
string str = any-object as string;
1) これにより、任意のオブジェクトが文字列型としてキャストされます。任意のオブジェクトが文字列にキャストできない場合、このステートメントは例外をスローせずに null を返します。
2) これはコンパイラ サービスです。
3) これは、文字列以外の他の型に対してはかなりうまく機能します。例: Employee のような任意のオブジェクトとして実行できます。ここで、Employee はライブラリで定義されたクラスです。
string str = any-object.ToString();
1) これは、型定義から any-object の ToString() を呼び出します。System.Object は ToString() メソッドを定義しているため、.Net フレームワークのどのクラスにも、オーバーライドに使用できる ToString() メソッドがあります。プログラマーは、任意オブジェクト クラスまたは構造体定義で ToString() をオーバーライドし、任意オブジェクトが果たす責任と役割に従って任意オブジェクトの適切な文字列表現を返すコードを記述します。
2) 同様に、クラス Employee を定義し、従業員オブジェクトの文字列表現を "FIRSTNAME - LASTNAME, EMP-CDOE" として返す可能性のある ToString() メソッドをオーバーライドできます。
この場合、プログラマは ToString() を制御でき、キャストや型変換とは何の関係もないことに注意してください。
問題をさらに混乱させるために、C# 6.0 ではnull 条件演算子が導入されました。したがって、これは次のようにも記述できます。
Page.Theme = Session["SessionTheme"]?.ToString();
例外をスローせずに、 null または ToString() からの結果を返します。
as string
チェックは、オブジェクトが文字列であることです。nullでない場合は、返されます。
toToString()
を呼び出すと、実際ToString()
にオブジェクトのメソッドが呼び出されます。
最初のものは、クラスが文字列であるか、文字列から派生した場合、クラスを文字列として返します(失敗した場合はnullを返します)。
2つ目は、クラスでToString()メソッドを呼び出します。
上記のコードを実際に記述する最良の方法は、次のようにすることです。
if (Session["SessionTheme"] != null)
{
Page.Theme = Session["SessionTheme"].ToString();
}
そうすれば、NullReferenceException がキャストされないことがほぼ確実になります。