16

使用、効率、またはバックグラウンド技術に違いはありますか

var mc:MovieClip = MovieClip(getChildByName("mc"));

var mc:MovieClip = getChildByName("mc") as MovieClip;

?

どちらを選択するかは慣習や好みの問題ですか、それとも使用できない場合はありますか?

4

8 に答える 8

22

この記事では、違いについて詳しく説明しています。

キャストと as 演算子の主な違いは、失敗時の動作です。ActionScript 2 でキャストが失敗すると、null が返されます。ActionScript 3 でキャストが失敗すると、TypeError がスローされます。ActionScript 3 の as 演算子を使用すると、キャストが失敗するたびにデータ型のデフォルト値が返されます。

asまた、変換関数が優先されArrayたため、以前は不可能だったへのキャストも可能です。Array()

編集:パフォーマンスに関しては、使用asはさまざまな記事で関数呼び出しスタイルのキャストよりも高速であることが報告されています: [ 1 ] [ 2 ] [ 3 ]。引用された最初の記事では、パフォーマンスの違いを詳細に検討し、 as4 倍から 4.5 倍高速であると報告しています。

編集 2:as通常の最良のケースで 4 倍から 4.5 倍高速になるだけでなく、(cast)スタイル変換を try-catch ブロックでラップすると、実際にエラーがスローされ、30 倍から 230 倍高速になります。AS3 では、(エラーをスローする可能性があるという点で) 例外的なことをしようと考えている場合は、飛躍する前に常に確認する必要があることは明らかです。API によって強制されない限り、try/catch を使用しないでください。実際、これは絶対に使用しないことを意味し(cast) ます。また、例外がスローされない場合でも、try/catch のパフォーマンスへの影響を調べることも有益です。try/catch ブロックを設定すると、何も問題が発生しない場合でも、パフォーマンスが低下します。

于 2013-01-10T22:24:59.050 に答える
4

パフォーマンスの側面についてまだ誰も直接答えていないので、それはあなたの質問にもありましたが、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();
}

これは間違っていて無駄に思えます。

于 2013-01-11T06:36:20.863 に答える
2

AS3 ある型を別の型にキャストすることには、これにも答える答えが含まれています。null変換が失敗した場合は「as」キーワードが割り当てられ、それ以外の場合はTypeError.

于 2013-01-10T22:25:34.520 に答える
1

(キャスト) と "as" はまったく別のものです。「as」は、オブジェクトを指定されたタイプであるかのように解釈するようにコンパイラーに指示するだけですが (同じまたはサブクラスまたは数値/文字列変換でのみ機能します)、(キャスト) はターゲットクラスの静的変換関数を使用しようとします. これは失敗する (エラーをスローする) か、ターゲット クラスの新しいインスタンスを返す (同じオブジェクトではなくなる) 可能性があります。これは、速度の違いだけでなく、Alejandro PS によって説明されているエラー イベントでの動作についても説明しています。

その意味は明らかです。「as」は、オブジェクトのクラスがコーダーにはわかっているが、コンパイラにはわかっていない場合に使用されます (スーパークラスまたは「*」のみを指定するインターフェイスによって難読化されるため)。想定された型 (または自動強制と互換性のある型) が 100% 保証されない場合は、前に 'is' チェックまたは (より高速な) 後に null チェックを行うことをお勧めします。

(キャスト)は、オブジェクトを別のクラスに実際に変換する必要がある場合に使用されます(可能な場合)。

于 2016-07-12T14:31:07.873 に答える
1

asキーワードを使用することをお勧めします。

asRTE (実行時エラー) をスローしないという利点があります。たとえば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
于 2013-01-10T22:33:46.760 に答える
1

を使用するよりもキャストを使用することをお勧めしますas operator。as 演算子は、強制が失敗する可能性があり、例外をスローする代わりに式を null に評価する場合にのみ使用してください。

これを行う:

IUIComponent(child).document

これではない:

(child as IUIComponent).document

コーディング規約

于 2013-01-11T06:26:46.500 に答える
0

さらに、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 ()
于 2014-03-07T13:02:35.800 に答える
0

var mc:MovieClip = MovieClip(getChildByName("mc"));

ムービークリップとして直接設定します

var mc:MovieClip = getChildByName("mc") as MovieClip;

必要なタイプが同じ場合、mc はムービークリップのように動作します

于 2014-03-08T06:57:00.447 に答える