2014-01-09 4 views
0

У меня есть класс, в котором я пишу несколько методов. Я объявляю некоторые объекты в этом классе и Dispose их в блоке catch. Когда я попытался применить к нему Ruleset, он дает предупреждение CA2000. Мой код выглядит следующим образомКак удалить объект, созданный в методе класса в C#

public int ValidationExcelBal(string excelPath, string objectReferenceExcelPath) 
     { 
      DataTable dtPointList = new DataTable(); 
      DataTable dtAlarm = new DataTable(); 
      DataTable dtObjectReference = new DataTable(); 
      try 
      { 
       int objectReferenceColNum = -1; 
       int objectReferenceAlarmColNum = -1; 


       objGGTAutoBindingToolDal.YomitoriExcelToDataTable(excelPath, ref dtPointList, ref dtAlarm); 
       objGGTAutoBindingToolDal.ObjectReferenceExcelToData(objectReferenceExcelPath, ref dtObjectReference); 

       #region code to find object reference column number in excel sheet and Alarm sheet 


       for (int i = 0; i < dtPointList.Columns.Count; i++) 
       { 
        for (int k = 0; k < dtPointList.Rows.Count; k++) 
        { 
         if (k < 4) 
         { 
          string name = dtPointList.Rows[k][i].ToString().Replace("\n", "").Replace(" ", ""); 
          if (name == "ObjectReference") 
          { 
           objectReferenceColNum = i; 
           break; 
          } 
         } 
        } 
       } 

       //code to find colomn number of object reference field in Alarm sheet 
       for (int j = 0; j < dtAlarm.Columns.Count; j++) 
       { 
        string name = dtAlarm.Rows[0][j].ToString(); 
        if (name.Equals("Object Reference")) 
        { 
         objectReferenceAlarmColNum = j; 
         break; 
        } 
       } 

       #endregion 

       if (objectReferenceColNum == -1 || objectReferenceAlarmColNum == -1) 
       { 
        return 1; 
       } 

       //if (Convert.ToString(dtObjectReference.Columns[0]).Contains("Bldg Name") || Convert.ToString(dtObjectReference.Columns[1]).Contains("Graphics Name") || Convert.ToString(dtObjectReference.Columns[2]).Contains("Controller Object Reference")) 
       //{ 

       // return 2; 
       //} 

       return 3; 
      } 
      catch (Exception) 
      { 
       dtPointList.Dispose(); 
       dtAlarm.Dispose(); 
       dtObjectReference.Dispose(); 
       throw; 
      } 
     } 

и мое предупреждение как следовать

Warning 17 CA2000 : Microsoft.Reliability : In method 'GgtAutoBindingToolBal.ValidationExcelBal(string, string)', call System.IDisposable.Dispose on object 'dtPointList' before all references to it are out of scope. D:\Project\Pragati Installer\GGTAutoBindingBll\GgtAutoBindingToolBal.cs 26 GgtAutoBindingBll 

ответ

3

Самое лучшее, что нужно сделать, это заменить ручной вызов Dispose() с using заявления (будем называть Dispose(), когда исчерпает объем).

using (DataTable dtPointList = new DataTable()) { 
    ... 
} 

Пример:

using (DataTable dtPointList = new DataTable()) { 
    using (DataTable dtAlarm = new DataTable()) { 
     using (DataTable dtObjectReference = new DataTable()) { 
      // your code here, no need to call Dispose() on any of these objects 
     } 
    } 
} 
+1

Для этого вам необходимо реализовать IDisposable Interface на вашем классе и утилизировать объекты внутри метода Dispose(). – Shetty

+0

Dispose для неуправляемых ресурсов, таких как файловые дескрипторы и базы данных соединений. Эмпирическое правило - вызывать Dispose на любом объекте , который реализует IDisposable. – vikky

+0

Я не понял, что вы хотите сказать, можете ли вы привести пример. – Fazil

0

Вы называете выбрасывайте только в блоке поймать. Что делать, если в блоке try нет исключения? Разве это не должно быть там? Попробуйте и посмотрите, есть ли предупреждение, которое я все еще там. Как уже упоминалось в другом ответе - использование - ваш лучший вариант. Таким образом, ресурс будет использоваться в области использования кода.

public int ValidationExcelBal(string excelPath, string objectReferenceExcelPath) 
{ 
    using (DataTable dtPointList = new DataTable()) 
    { 
     using (DataTable dtAlarm = new DataTable()) 
     { 
      using (DataTable dtObjectReference = new DataTable()) 
      { 
       try 
       { 
        int objectReferenceColNum = -1; 
        int objectReferenceAlarmColNum = -1; 


        objGGTAutoBindingToolDal.YomitoriExcelToDataTable(excelPath, ref dtPointList, ref dtAlarm); 
        objGGTAutoBindingToolDal.ObjectReferenceExcelToData(objectReferenceExcelPath, ref dtObjectReference); 

        #region code to find object reference column number in excel sheet and Alarm sheet 


        for (int i = 0; i < dtPointList.Columns.Count; i++) 
        { 
         for (int k = 0; k < dtPointList.Rows.Count; k++) 
         { 
          if (k < 4) 
          { 
           string name = dtPointList.Rows[k][i].ToString().Replace("\n", "").Replace(" ", ""); 
           if (name == "ObjectReference") 
           { 
            objectReferenceColNum = i; 
            break; 
           } 
          } 
         } 
        } 

        //code to find colomn number of object reference field in Alarm sheet 
        for (int j = 0; j < dtAlarm.Columns.Count; j++) 
        { 
         string name = dtAlarm.Rows[0][j].ToString(); 
         if (name.Equals("Object Reference")) 
         { 
          objectReferenceAlarmColNum = j; 
          break; 
         } 
        } 

        #endregion 

        if (objectReferenceColNum == -1 || objectReferenceAlarmColNum == -1) 
        { 
         return 1; 
        } 

        //if (Convert.ToString(dtObjectReference.Columns[0]).Contains("Bldg Name") || Convert.ToString(dtObjectReference.Columns[1]).Contains("Graphics Name") || Convert.ToString(dtObjectReference.Columns[2]).Contains("Controller Object Reference")) 
        //{ 

        // return 2; 
        //} 

        return 3; 
       } 
       catch (Exception) 
       { 
        dtPointList.Dispose(); 
        dtAlarm.Dispose(); 
        dtObjectReference.Dispose(); 
        throw; 
       } 
      } 
     } 



    } 
} 
+0

Я попытался утилизировать его в блоке try, но все же предоставлял такое же сообщение об ошибке. – Fazil

+0

Я пробовал это, но давал ошибку при попытке передать таблицу Данных методу, потому что он использует переменную. – Fazil

+0

Можете ли вы, пожалуйста, обновить свой вопрос, чтобы затем отразить этот случай? Я не вижу параметр DataTable в вашем текущем методе. –

Смежные вопросы