2011-02-10 5 views
6

私はバグに遭い、私を悩ませていました。私はJObjectを持っていたと思っていました。.ToString()、(文字列)、またはStringです。何を使うの?

obj["role"].ToString() 

文字列はそこにありました。最終的な解決策は、何が起こっているかを確認するだけで

(string)obj["role"] 

に変更することでした。私の質問は、 "文字列"ではなく、(文字列)ではなく、.ToString()をいつ使うべきかを知る方法です。

答えて

17

オブジェクトがstringある、または(string)への明示的なキャスト演算子があり、そうでなければ

string s = (string)obj["role"]; 

を言って大丈夫であれば、これはあなたにInvalidCastExceptionを与えるだろう。ここにあなたがobj["role"]stringのインスタンスではない場合nullsを設定します

string s = obj["role"] as String; 

を言うことができることを

は注意してください。 asの場合、明示的キャスト演算子は無視されることに注意してください。

obj["role"]stringstringへの明示的なキャスト演算子を持つクラスのインスタンスでもないならば、あなたは

string s = obj["role"].ToString(); 

を言うしかし、注意する必要があり、後者はNullReferenceExceptionを投げることができます。

+0

.Netのすべてのオブジェクトは、 '.ToString()'メソッドを持つ 'System.Object'から継承しています - まだ' .ToString() 'を呼び出すためにヌル参照を投げるオブジェクトを見つけていませんそれは - 私が-1の前に、例を挙げることができますか? – Basic

+7

@Basiclife: 'obj [" role "]'が 'null'の場合、' obj ["role"] .ToString() 'はヌル参照を逆参照しようとしているので' NullReferenceException'を投げます。 – jason

+0

'NullReferenceException'を避けるために' string s =(obj ["role"] ?? string.Empty).ToString(); 'のようなコードを見たことがあります。それが良い練習かどうかは言えませんでした。 –

1

(string)は、インスタンスをstringにキャストします。キャストしようとしているオブジェクトが文字列でない場合は、実行時にthrow an exceptionと表示されることがあります。 as演算子もキャストを試みますが、インスタンスが文字列ではなくnullを返す場合は例外をスローしません。もちろん、ToStringメソッドはSystem.Objectから来ているので、基になる型がそれをオーバーライドしているかどうかによって異なります。

0

あなたの例では違いはありません。違いが生じる唯一のシナリオは、obj["role"]の種類に基づいてユーザータイプ変換(stringへの変換)が定義されている場合です。その場合、可能であれば、stringへのキャストは別のオブジェクトに変更され、.ToString()は異なる方法で実装されました。