6

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

object foo = null;

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

4

3 回答 3

10

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

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

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

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

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

于 2012-10-24T19:38:55.717 回答
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 方法(在新的 Cache 版本中是默认设置)或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
}
于 2012-10-25T04:14:18.993 回答
2

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

K VARIABLE

或者

KILL VARIABLE
于 2013-08-21T19:51:20.213 回答