C# 如何处理在C中类的方法中创建的对象#

C# 如何处理在C中类的方法中创建的对象#,c#,C#,我有一个类,我在其中编写了几个方法。我在该类中声明了一些对象,并在catch块中处置它们。当我试图在其上应用规则集时,它会发出CA2000的警告消息。我的代码如下 public int ValidationExcelBal(string excelPath, string objectReferenceExcelPath) { DataTable dtPointList = new DataTable(); DataTable d

我有一个类,我在其中编写了几个方法。我在该类中声明了一些对象,并在
catch
块中处置它们。当我试图在其上应用
规则集
时,它会发出CA2000的警告消息。我的代码如下

 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

最好的做法是使用
语句将手动调用
Dispose()
替换为
(超出范围时将调用
Dispose()

例如:

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
        }
    }
}

最好的做法是使用
语句将手动调用
Dispose()
替换为
(超出范围时将调用
Dispose()

例如:

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
        }
    }
}

最好的做法是使用
语句将手动调用
Dispose()
替换为
(超出范围时将调用
Dispose()

例如:

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
        }
    }
}

最好的做法是使用
语句将手动调用
Dispose()
替换为
(超出范围时将调用
Dispose()

例如:

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
        }
    }
}

只能在catch块中调用dispose。如果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;
                }
            }
        }



    }
}
public int ValidationExcelBal(字符串excelPath,字符串objectReferenceExcelPath)
{
使用(DataTable dtPointList=new DataTable())
{
使用(DataTable dtAlarm=new DataTable())
{
使用(DataTable dtObjectReference=new DataTable())
{
尝试
{
int objectReferenceColNum=-1;
int objectReferenceAlarmColNum=-1;
OBJGGTOOLDAL.YOMITORIEXCELTODATABLE(excelPath、ref dtPointList、ref dtAlarm);
ObjectReferenceExcelToData(objectReferenceExcelPath,ref-dtObjectReference);
#用于在excel工作表和报警表中查找对象参考列编号的区域代码
for(int i=0;i
仅在catch块中调用dispose。如果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;
                }
            }
        }



    }
}
public int ValidationExcelBal(字符串excelPath,字符串objectReferenceExcelPath)
{
使用(DataTable dtPointList=new DataTable())
{
使用(DataTable dtAlarm=new DataTable())
{
使用(DataTable dtObjectReference=new DataTable())
{
尝试
{
int objectReferenceColNum=-1;
int objectReferenceAlarmColNum=-1;
OBJGGTOOLDAL.YOMITORIEXCELTODATABLE(excelPath、ref dtPointList、ref dtAlarm);
ObjectReferenceExcelToData(objectReferenceExcelPath,ref-dtObjectReference);
#用于在excel工作表和报警表中查找对象参考列编号的区域代码
for(int i=0;i