インスタンス化“ AS”キーワード
質問
最近、JSONとExtJsフレームワークの使用を開始しましたが、次のコード例に出くわしました。
これを使用してフロントエンドから情報を取得します:
object updatedConfig = JavaScriptConvert.DeserializeObject(Request["dataForm"]);
この例では、次のことを行います。
JavaScriptObject jsObj = updatedConfig as JavaScriptObject;
「as」を一度も見たことがありません。その前に使用されたキーワード。これは、明示的にupdatedConfig変数をJavaScriptObjectとして明示的にボックス化する別の形式ですか、またはこれについて理解していないものがありますか?
ありがとう
解決
これはセーフキャストとして知られています。行われていることは、あるタイプから別のタイプにキャストしようとし、キャストが失敗した場合、 InvalidCastException
をスローする代わりに null
を返します。
実際には、" as
"の違いを処理するための2つの別個のIL命令があります。鋳造および通常の静的鋳造。次のC#コードには、両方のタイプのキャストが含まれています。
using System;
class Program
{
static void Main()
{
Object o = null;
String s0 = (String)o;
String s1 = o as String;
}
}
最初のキャストはIL命令 castclass
を使用し、2番目のキャストは isinst
命令を使用します。
キャストと「as」キーワードの使用をご覧ください。詳細については、CLR を参照してください。
他のヒント
asキーワードの方が安全ですC#でオブジェクトをキャストする方法。
SomeType a = obj as SomeType;
obj
が SomeType
型の場合、 obj
はその型にキャストされることを意味します。 obj
がヌルであるか、タイプが SomeType
でない場合、aはヌルになります。
asキーワードのもう1つの利点は、as(キャスト)が実行時まで壊れない場合に型をキャストできない場合、コンパイル時例外がスローされることです。
また、" as"を覚えておくことが重要です。オブジェクト自体ではなく参照で動作します。オブジェクトがそのまま残るため、例外をスローする代わりにnullを返すことができるのはそのためです。それが、参照型でしかできない理由です。
通常はそれほど重要ではありませんが、キャスト関数を実装する場合( MSDN )は、as演算子を使用して 呼び出されません。
したがって、as演算子は「継承階層を上下に移動する」のに便利です:クラスPersonがある場合、次のようにできます。 Person p = new Person(); ojbect o = pオブジェクトとして; p = o Personとして; ただし、すべての場合において、メモリ内のオブジェクトはいかなる方法でも変更されることはなく、単に参照されるだけです。
役立つこと