2012-10-24 16 views

Antwort

10

Für einfache Variablen gibt es keine Möglichkeit, eine Variable auf einen nicht definierten Wert zu setzen. Da das Cache-Objektskript eine lose Typisierung hat, ist es nicht notwendig, einen Objektverweis auf NULL zu setzen. Es genügt, den Wert des Verweises auf eine andere, meist leere Zeichenkette zu ändern, und der Garbage Collector bereinigt die Objekte dafür welches es keine aktive Referenz gibt.

Für alle praktischen Zwecke reicht es, diese Variable auf die leere Zeichenfolge "" zu setzen. Wenn nicht, können Sie Ihre Frage erweitern?

Objekteigenschaften im Cache-Objekt-Skript werden niemals zu einem nicht definierten Wert aufgelöst. Wenn der Wert nicht definiert ist (weil er den SQL-Wert NULL hat oder ihm noch nie ein Wert zugewiesen wurde), wird die Eigenschaft in den Wert der leeren Zeichenfolge aufgelöst. Wenn Sie möchten, dass die Eigenschaft die SQL-Repräsentation von NULL enthält, können Sie ein SQL-Insert oder Update für die Zeile ausführen, die diesem Objekt entspricht, und das Feld auf NULL setzen. Wenn Sie die Eigenschaft des Objekts auf eine leere Zeichenfolge festlegen und sie speichern, hat die SQL-Zeile für dieses Objekt keine NULL, sondern eine leere Zeichenfolge.

Grundsätzlich gibt es nicht wirklich eine abstrakte Darstellung von NULL in der Objektansicht. Es gibt serialisierte Werte für SQL NULL, die in der SQL-Ansicht auf NULL aufgelöst werden und in der Sicht Objekte eine leere Zeichenfolge enthalten.

übrigens der serialisierten Wert von NULL in der SQL-Ansicht ist leere Zeichenfolge, und der serialisierten Wert leerer Zeichenfolge ASCII 0.

+1

Als Seite beachten Sie $ IsObject() verwenden können, um zu überprüfen, ob eine Variable einen Nullverweis enthält. –

6

Um Variable aus dem Speicher und Müll zu löschen Objekt collect Bezug genommen wird, können Sie kill Befehl

Method Test() { 
    set foo=##class(Obj).%New() 
    // created object of class Obj. created variable foo pointing to this object. 
    // do something 
    set foo="" 
    // Object of class Obj is now marked for garbage collection 
    // but variable foo still exist 
    // do something else 
    kill foo 
    // foo is now undefined 
    // do something else 
} 

dies ist jedoch nicht erforderlich, wenn Sie ProcedureBlock Methoden (es ist standardmäßig in neuen Cache-Versionen) oder new Befehl verwenden. In diesem Fall werden alle Objektreferenzen und Variablen automatisch zerstört werden nach dem Verfahren

Method Test() { 
    set foo=##class(Obj).%New() 
    // created object of class Obj. created variable foo pointing to this object. 
    // do something 
} 
// after method finishes, foo is undefined and object of class Obj is destroyed 

beendet Wenn Sie nur erklären wollen, dass der Variable eines bestimmten Typs ist, können Sie #dim Direktive verwenden. Es tut nichts, hilft nur Studio, variable Klasse zu bestimmen. Manchmal ist es nützlich, wenn Studio die Klasse selbst nicht bestimmen kann und Sie seine Inline-Helfer verwenden möchten.

Method Test() { 
    #dim foo as Obj 
    do ##class(Obj).GenerateSomething(.foo) 
    write foo.Property 
    // Studio will provide helper bar for foo properties and methods now 
} 
+0

Ah ja ... Töten macht es natürlich undefiniert. Ich habe nicht nachgedacht. – mcbainpc

2

Die ausgewählte Lösung ist definitiv ungenau. Wenn Sie eine Variable auf NULL setzen wollten, wie in Ihrem Beispiel angegeben, würden Sie tun, wie von SSH angegeben. Sie würden:

K VARIABLE 

oder

KILL VARIABLE 
+1

Ja das ist richtig, ich habe an Objektreferenzen gedacht und nicht an einfache Variable und das hat mein Denken getrübt. – mcbainpc

+0

Keine Sorgen. Ich bin ein objektorientierter Entwickler, der auch umgekehrt denken muss. Irgendwann werden wir alle zum Unterricht wechseln. Haha. – MackAltman

Verwandte Themen