使用、効率、またはバックグラウンド技術に違いはありますか
var mc:MovieClip = MovieClip(getChildByName("mc"));
と
var mc:MovieClip = getChildByName("mc") as MovieClip;
?
どちらを選択するかは慣習や好みの問題ですか、それとも使用できない場合はありますか?
使用、効率、またはバックグラウンド技術に違いはありますか
var mc:MovieClip = MovieClip(getChildByName("mc"));
と
var mc:MovieClip = getChildByName("mc") as MovieClip;
?
どちらを選択するかは慣習や好みの問題ですか、それとも使用できない場合はありますか?
この記事では、違いについて詳しく説明しています。
キャストと as 演算子の主な違いは、失敗時の動作です。ActionScript 2 でキャストが失敗すると、null が返されます。ActionScript 3 でキャストが失敗すると、TypeError がスローされます。ActionScript 3 の as 演算子を使用すると、キャストが失敗するたびにデータ型のデフォルト値が返されます。
as
また、変換関数が優先されArray
たため、以前は不可能だったへのキャストも可能です。Array()
編集:パフォーマンスに関しては、使用as
はさまざまな記事で関数呼び出しスタイルのキャストよりも高速であることが報告されています: [ 1 ] [ 2 ] [ 3 ]。引用された最初の記事では、パフォーマンスの違いを詳細に検討し、 as
4 倍から 4.5 倍高速であると報告しています。
編集 2:as
通常の最良のケースで 4 倍から 4.5 倍高速になるだけでなく、(cast)
スタイル変換を try-catch ブロックでラップすると、実際にエラーがスローされ、30 倍から 230 倍高速になります。AS3 では、(エラーをスローする可能性があるという点で) 例外的なことをしようと考えている場合は、飛躍する前に常に確認する必要があることは明らかです。API によって強制されない限り、try/catch を使用しないでください。実際、これは絶対に使用しないことを意味し(cast)
ます。また、例外がスローされない場合でも、try/catch のパフォーマンスへの影響を調べることも有益です。try/catch ブロックを設定すると、何も問題が発生しない場合でも、パフォーマンスが低下します。
パフォーマンスの側面についてまだ誰も直接答えていないので、それはあなたの質問にもありましたが、AS3 as
よりも実行時に劇的に効率的で高速です。(cast)
http://jacksondunstan.com/articles/830
他のすべての要因と組み合わせると、使用する理由はまったくなく、(cast)
完全に避けるべきだと感じています.
以下の撤回されたコメントは、これに関しても良い点を思い出させてくれます。もしそうなら(cast)
、あなたはほぼ間違いなく、あなたが試したり捕まえたりしなければならない状況に陥るでしょう。
try{
SubType(foo).bar();
}catch(e:TypeError){
// Can't cast to SubType
}
これは殺人的に遅いです。それを回避する唯一の方法は、is
最初にチェックすることです
if(foo is SubType){
SubType(foo).bar();
}
これは間違っていて無駄に思えます。
AS3 ある型を別の型にキャストすることには、これにも答える答えが含まれています。null
変換が失敗した場合は「as」キーワードが割り当てられ、それ以外の場合はTypeError
.
(キャスト) と "as" はまったく別のものです。「as」は、オブジェクトを指定されたタイプであるかのように解釈するようにコンパイラーに指示するだけですが (同じまたはサブクラスまたは数値/文字列変換でのみ機能します)、(キャスト) はターゲットクラスの静的変換関数を使用しようとします. これは失敗する (エラーをスローする) か、ターゲット クラスの新しいインスタンスを返す (同じオブジェクトではなくなる) 可能性があります。これは、速度の違いだけでなく、Alejandro PS によって説明されているエラー イベントでの動作についても説明しています。
その意味は明らかです。「as」は、オブジェクトのクラスがコーダーにはわかっているが、コンパイラにはわかっていない場合に使用されます (スーパークラスまたは「*」のみを指定するインターフェイスによって難読化されるため)。想定された型 (または自動強制と互換性のある型) が 100% 保証されない場合は、前に 'is' チェックまたは (より高速な) 後に null チェックを行うことをお勧めします。
(キャスト)は、オブジェクトを別のクラスに実際に変換する必要がある場合に使用されます(可能な場合)。
as
キーワードを使用することをお勧めします。
as
RTE (実行時エラー) をスローしないという利点があります。たとえばDog
、MovieClip にキャストできないクラスがあるとします。このコードは RTE をスローします。
var dog:Dog = new Dog();
var mc:MovieClip = MovieClip(Dog);
TypeError: エラー #1034: Type Coercion failed: Dog を MovieClip に変換できません。
このコードを「安全」にするには、キャストをtry
/catch
ブロックで囲む必要があります。
一方、as
変換が失敗した場合は単純に null を返し、try
/catch
ブロックを使用せずに自分でエラーを確認できるため、より安全です。
var dog:Dog = new Dog();
var mc:MovieClip = Dog as MovieClip;
if (mc)
//conversion succeeded
else
//conversion failed
を使用するよりもキャストを使用することをお勧めしますas operator
。as 演算子は、強制が失敗する可能性があり、例外をスローする代わりに式を null に評価する場合にのみ使用してください。
これを行う:
IUIComponent(child).document
これではない:
(child as IUIComponent).document
さらに、RTE を起動するかどうか、または null を返すかどうかについては、別のアプリケーション ドメインにロードされた swf でエラーを管理する場合に大きな違いがあります。
Loader.uncaughtErrorEvents を使用して、ロードされた swf のエラーを処理します。「event.error as Error」のようにキャストすると、結果のエラーには元のスタック トレース (エラーの原因となった swf でキャッチされたものと同じもの) が含まれますが、それを Error (event.error) でキャストすると、スタックエラーのトレースは、(キャストが行われた) 現在のスタック トレースによって変更されます。
サンプルコード:
if (event && event.error && event.error is Error) {
debug ("Casting with 'as Error'")
debugStackTrace (event.error as Error);
debug ("casting with 'Error (...)'");
debugStackTrace (Error (event.error));
}
出力例:
Casting with 'as Error'
ReferenceError: Error # 1056
at Player / onEnterFrame ()
casting with 'Error (...)'
Error: ReferenceError: Error # 1056
at package :: HandlerClass / uncaughtErrorHandler ()
at EventInfo / listenerProxy ()
var mc:MovieClip = MovieClip(getChildByName("mc"));
ムービークリップとして直接設定します
var mc:MovieClip = getChildByName("mc") as MovieClip;
必要なタイプが同じ場合、mc はムービークリップのように動作します