2010-11-25 6 views
0

J'utilise habituellement if (object! = Null) mais cela ne fonctionne pas bien.Comment savoir si une classe a été instanciée

Comment puis-je vérifier si la classe est instanciée? Je veux me débarrasser du 'ne peut pas accéder à une propriété d'un objet ou d'une référence nulle'.

Merci! Je veux dire, l'objet 'var: Object;' est juste une référence à une instance de classe Object. Quand je l'initialise avec 'object = new Object()', il exécute le code dans le constructeur, l'initialisant. Comment puis-je vérifier si elle a été initialisée ou non.

+0

Pouvez-vous montrer un exemple où 'if (object! = Null)' échoue? Il est difficile de voir de quelle autre façon vous seriez capable de dire s'il a une référence non nulle. Ou voulez-vous dire initialisé - comme toutes les propriétés ont été définies? –

+0

Oui, initialisé. – Loop

+0

pouvez-vous poster en quoi consiste l'initialisation? – Patrick

Répondre

1

Si vous avez vraiment besoin de savoir si la classe a été initialisée, je vous recommande d'utiliser un getter dans la classe qui renvoie une valeur true lorsque vous avez terminé votre initialisation. Bien sûr, cela ne fonctionne que si vous avez créé une instance de la classe. Si je ne suis pas sûr que l'instance existe, je vérifie d'abord si l'instance est créée. Je n'ai jamais eu de problèmes avec ça.

if(myObject && myObject.isInitialized) 
{ 
    // success 
} 
+0

aussi, puisque vous faites apparaître des conditions multiples, pour l'optimisation du code, vous devriez toujours mettre au moins le contrôle intense du processeur d'abord dans le conditionnel. Je sais que cela semble nit difficile, mais alors que vous êtes sur le sujet de plusieurs conditions, je pensais que je le mentionnerais:) ... PS, j'allais ajouter ce commentaire à votre article, mais le bouton de soumission ne semble pas fonctionner:/ – gthmb

+0

gthmb: Merci pour le commentaire. Je ne suis pas sûr de le comprendre. Je devine que vous voulez dire que je ne devrais pas utiliser plusieurs conditions par défaut, car il faut plus de CPU pour calculer. Je suis conscient de cela et par conséquent je ne l'utilise que lorsque je ne suis pas sûr que la variable est définie. Je vais regarder dans le bug de commentaire Wordpress. Merci. – Mattias

+0

gthmb: Dans ce cas, vous voulez absolument myObject car le conditionnel suivant lève une exception de pointeur null s'il n'est pas vérifié en premier. – Greg

0

au lieu de if(myobj!=null), vous pouvez juste faire if(myobj).

La vérification pour voir si une instance ou une propriété est null est différente de vérifier si elle existe.

if(myobj) 

échouera si myobj est null ou undefined alors que if(myobj!=null) misses undefined (qui est ce que la référence de l'instance serait si elle n'a jamais été attribué une valeur).

note: le if(myobj) sera également faux si la valeur est définie sur false ou 0. Puisque vous vérifiez une exception de pointeur nul (donc en utilisant un objet complexe), vous pouvez exclure false et 0 de valeurs viables (vous donnant un faux négatif) et utiliser l'instruction plus générale pour vérifier si l'instance existe.

0

Vous pouvez avoir une situation courante où vous commencez à charger certains éléments dans le constructeur, supposons une image d'arrière-plan. Ce code ne fonctionnerait pas correctement:

var object:TestObject = new TestObject(); //inside the contructor, the background image will start loading 
object.background.width = 120; // this will not work, because the background is not loaded yet 

Il y a beaucoup de façons de résoudre ce ...

Vous pouvez charger les actifs avant de créer l'objet, et après ils sont chargés de les envoyer complètement le constructeur en tant que paramètres.

Ou vous pouvez définir des propriétés à l'intérieur de l'objet qui sera affecté aux actifs chargés quand ils le chargement complet, quelque chose comme ceci:

//outside 
object.BackgroundWidth = 120; 

---------- 

//inside the class 
public var BackgroundWidth:int; 
private var background:Bitmap; 

public function TestObject(){ 
    var loader:Loader = new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, assignProperties); 
    loader.load("img.png"); 
} 
//this will make sure the width is applied to the background 
//when it's loaded completely 
private function assignProperties(e:Event){ 
    background = Bitmap((event.currentTarget as LoaderInfo).content); 
    background.width = BackgroundWidth; 
} 

J'espère que cela a aidé.

Questions connexes