2012-10-24 34 views

Trả lời

10

Đối với các biến đơn giản, không có cách nào để đặt biến có giá trị không xác định. Kể từ khi Script đối tượng bộ nhớ cache đã gõ lỏng lẻo, nó không phải là cần thiết để thiết lập một tham chiếu đối tượng để NULL, nó là đủ để thay đổi giá trị của tham chiếu đến bất cứ điều gì khác, chuỗi rỗng phổ biến nhất, và thu gom rác sẽ làm sạch các đối tượng cho không có tham chiếu đang hoạt động.

Đối với tất cả các mục đích thực tế, hãy đặt biến đó thành chuỗi trống "", là đủ. Nếu không, bạn có thể mở rộng câu hỏi của mình không?

Thuộc tính đối tượng trong Tập lệnh đối tượng bộ nhớ cache không bao giờ giải quyết thành giá trị không xác định. Nếu giá trị là không xác định (vì nó có giá trị SQL là NULL hoặc chưa bao giờ được gán giá trị), thì thuộc tính sẽ giải quyết thành giá trị của chuỗi rỗng. Nếu bạn muốn thuộc tính chứa biểu diễn SQL rỗng, bạn có thể thực hiện Chèn hoặc Cập nhật SQL trên hàng tương ứng với đối tượng đó và đặt trường thành NULL. Nếu bạn đặt thuộc tính của đối tượng thành chuỗi rỗng và lưu nó, hàng SQL cho đối tượng đó sẽ không có NULL, nhưng sẽ có chuỗi rỗng.

Về cơ bản, không có biểu diễn trừu tượng nào về NULL trong chế độ xem đối tượng. Có các giá trị được tuần tự hóa cho SQL NULL giải quyết thành NULL trong khung nhìn SQL và chuỗi rỗng trong khung nhìn Objects.

Ngẫu nhiên, giá trị của serialized NULL trong giao diện SQL là chuỗi rỗng, và giá trị tuần tự của chuỗi rỗng là ASCII 0.

+1

Là một phụ lưu ý bạn có thể sử dụng $ IsObject() để kiểm tra xem một biến chứa một tham chiếu null. –

6

Để xóa biến từ bộ nhớ và rác thu thập tham chiếu đối tượng, bạn có thể sử dụng lệnh 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 
} 

Tuy nhiên điều này không cần thiết nếu bạn sử dụng lệnh ProcedureBlock (mặc định trong phiên bản Cache mới) hoặc new. Trong trường hợp này, tất cả các tài liệu tham khảo đối tượng và các biến sẽ bị phá hủy tự động sau khi phương pháp của bạn kết thúc

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 

Nếu bạn chỉ muốn tuyên bố rằng biến là loại nhất định, bạn có thể sử dụng #dim chỉ thị. Nó không làm gì cả, chỉ giúp Studio xác định lớp biến. Đôi khi nó hữu ích nếu Studio không thể tự xác định lớp và bạn muốn sử dụng các trình trợ giúp nội tuyến của nó.

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 yes ... Giết làm cho nó không được xác định. Tôi không nghĩ. – mcbainpc

2

Giải pháp đã chọn chắc chắn không chính xác. Nếu bạn muốn đặt một biến thành NULL như đã nêu trong ví dụ của bạn, bạn sẽ làm như đã nêu bởi SSH. Bạn sẽ:

K VARIABLE 

hoặc

KILL VARIABLE 
+1

Có điều này là đúng, tôi đã suy nghĩ về tham chiếu đối tượng và không biến đơn giản và điều này làm suy nghĩ của tôi. – mcbainpc

+0

Không phải lo lắng. Tôi là một nhà phát triển hướng đối tượng cũng phải suy nghĩ ngược lại. Cuối cùng, chúng tôi sẽ chuyển mọi người sang lớp học. Haha. – MackAltman

Các vấn đề liên quan