如何在ObjectScript中将变量设置为NULL?

时间:2012-10-24 19:02:22

标签: intersystems-cache objectscript

在c#中,我可以这样做:

object foo = null;

如何在对象脚本中执行此操作?

3 个答案:

答案 0 :(得分:10)

对于简单变量,没有办法将变量设置为具有未定义的值。由于缓存对象脚本具有松散的类型,因此不必将对象引用设置为NULL,只需将引用的值更改为其他任何内容,最常见的是空字符串,垃圾收集器将清除对象哪个没有有效参考。

出于所有实际目的,将该变量设置为空字符串“”就足够了。如果没有,你可以扩展你的问题吗?

缓存对象脚本中的对象属性永远不会解析为未定义的值。如果值未定义(因为它的SQL值为NULL或从未分配过值),则属性将解析为空字符串的值。如果希望该属性包含null的SQL表示形式,则可以对与该对象对应的行执行SQL Insert或Update,并将该字段设置为NULL。如果将对象的属性设置为空字符串并保存它,则该对象的SQL行将不具有NULL,但将具有空字符串。

基本上,对象视图中实际上没有NULL的抽象表示。 SQL NULL的序列化值在SQL视图中解析为NULL,在Objects视图中解析为空字符串。

顺便提一下,SQL视图中NULL的序列化值为空字符串,空字符串的序列化值为ASCII 0。

答案 1 :(得分:6)

要从内存和垃圾收集引用对象中清除变量,可以使用kill命令

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
}

但是,如果您使用ProcedureBlock方法(新缓存版本中的默认值)或new命令,则无需这样做。在这种情况下,所有对象引用和变量将在方法完成后自动销毁

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

如果您只想声明变量属于某种类型,则可以使用#dim指令。它什么都不做,只是帮助Studio确定变量类。有时,如果Studio无法确定类本身并且您想使用其内联帮助程序,则它很有用。

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
}

答案 2 :(得分:2)

所选解决方案绝对不准确。如果您想按照示例中的说明将变量设置为NULL,则可以按照SSH的说明进行操作。你会:

K VARIABLE

KILL VARIABLE