2010-11-19 20 views
2

Bu kod pasajını Verilen: olması gerektiği gibi beyan Liste changedRows doğrultusunda önceVS2008 hata ayıklayıcısı kapsam dışı nesnelerin üzerine mi tutuluyor?

// Get first key // 
int? keyEDISecurity = this.WorkQueue.GetNextWorkItem(); 

// Done? // 
while (keyEDISecurity != null) 
{ 
    try 
    { 

     ... 

     // Write changes // 
     List<ISNLEditableObject> changedRows = this.WorkQueue.GetChangedRows((int)keyEDISecurity); 
     this.Writer.Write(changedRows, WriteFlags.Transactional); 

     ... 
    } 
    catch (Exception ex) 
    { 
     // Exception handling/logging code 
    } 
    finally 
    { 
     // Remove all data for the KeyEDISecurity from work queue cache // 
     this.WorkQueue.RemoveData((int)keyEDISecurity); 
    } 

    // Get next work item // 
    keyEDISecurity = this.WorkQueue.GetNextWorkItem(); 
} 

, changedRows, null. Sonraki iş öğelerini aldığınızda kapsam dışıdır. Daha sonra geri dönersiniz ve aynı satırdan önce, değiştirilen satırlara erişirseniz, bildirilmemesi gerektiği için tekrar boş olmalıdır.

Kesin ve düzenlerseniz, beklediğiniz gibi, değişkenin Altına erişemezsiniz, çünkü kapsam dışıdır ve henüz bildirilmemiştir. Eğer bunu değerlendirirseniz (fare ile veya hemen pencereyi kullanarak), döngünün önceki yinelemesinden değiştirilen satırlara erişebilirsiniz. WTH?

Bunu gören oldu mu? Program, kodu doğru bir şekilde göründüğü gibi etkilemez, ancak hata ayıklayıcı sorunu beklendiği gibi davranmadığından zaman kaybı yaratır. Bu beklenen bir davranış olup olmadığını merak ediyordum, bu yüzden gelecekte de anlayabiliyordum ve onunla zaman harcamam.

cevap

6

Bu, uygulamaya özgü en iyileştirme yöntemidir.

İşlev yürütüldüğünde, tüm değişkenleri genellikle yığında aynı anda oluşturulur. Dil henüz onlara erişmesine izin vermiyor olsa da, oradalar. Bu, bildirilmeden önce changedRows'un null nedenidir.

Değişken kapsam dışına çıktığında, dil tekrar kullanılmasına izin vermez, ancak hala yığınta bulunur. Değerinin hiçbir yerde kullanılmayacağı için null olarak değiştirilmesine gerek yoktur. İşlemci zaman kaybı olacak. Bu nedenle, changedRows değeri, dil kurallarına göre, korunmalıdır (kapsam dışına çıktığında) ve yeniden oluşturulduğunda (bildirildiğinde) korunmalıdır.

Hata ayıklayıcı, tüm dil kurallarına uymuyor. Hatta bazı yapılar tarafından bile karıştırılabilir. Bir değişkenin değerini almaya çalıştığınızda, hata ayıklayıcı kapsamda olup olmadığını kontrol etmez.

İlgili konular